2013-01-03 51 views
1

我有一些奇怪的行爲,在泛型類中定義了默認值枚舉。 MS .NET 4.0使用默認值,但mono似乎回退到第一個枚舉定義(這是零值)。錯誤的Mono嵌套在泛型類中的默認參數

我寫了一個小測試,它只能在MS .NET上正常運行,但不能在單聲道上運行。

using System; 
using NUnit.Framework; 

namespace enumErrorTest 
{ 

    class EnumWrapperCtor<T> { 
     public enum Test { 
      Wrong, 
      MyDefault 
     } 

     private readonly T otherVal; 
     private readonly Test myVal; 

     public EnumWrapperCtor (Test value = Test.MyDefault) 
     { 
      myVal = value; 
     } 

     public Test getValue() 
     { 
      return myVal; 
     } 

     public Test echo (Test value = Test.MyDefault) 
     { 
      return value; 
     } 
    } 

    class EnumWrapperField<T> { 
     public enum Test { 
      Wrong, 
      MyDefault 
     } 

     private readonly T otherVal; 
     private readonly Test myVal = Test.MyDefault; 

     public Test getValue() 
     { 
      return myVal; 
     } 
    } 

    class EnumWrapper { 
     public enum Test { 
      Wrong, 
      MyDefault 
     } 

     private readonly Test myVal;//= Test.MyDefault; 

     public EnumWrapper (Test value = Test.MyDefault) 
     { 
      myVal = value; 
     } 

     public Test getValue() 
     { 
      return myVal; 
     } 
    } 

    [TestFixture] 
    class Proof 
    { 
     [Test] 
     public void NoGenerics() 
     { 
      var ew = new EnumWrapper(); 
      Assert.AreEqual(EnumWrapper.Test.MyDefault, ew.getValue()); 
     } 

     [Test] 
     public void Ctor() 
     { 
      var ew = new EnumWrapperCtor<int>(); 
      Assert.AreEqual(EnumWrapperCtor<int>.Test.MyDefault, ew.getValue()); 
     } 

     [Test] 
     public void Field() 
     { 
      var ew = new EnumWrapperField<int>(); 
      Assert.AreEqual(EnumWrapperField<int>.Test.MyDefault, ew.getValue()); 
     } 

     [Test] 
     public void Echo() 
     { 
      var ew = new EnumWrapperCtor<int>(); 
      Assert.AreEqual(EnumWrapperCtor<int>.Test.MyDefault, ew.echo()); 
     } 
    } 
} 

失敗的測試是CtorEcho

# nunit-console bin/Debug/enumErrorTest.exe 
NUnit-Console version 2.6.0.0 
Copyright (C) 2002-2012 Charlie Poole. 
Copyright (C) 2002-2004 James W. Newkirk, Michael C. Two, Alexei A. Vorontsov. 
Copyright (C) 2000-2002 Philip Craig. 
All Rights Reserved. 

Runtime Environment - 
    OS Version: Unix 3.2.0.35 
    CLR Version: 4.0.30319.1 (Mono 4.0 (2.10.8.1 (Debian 2.10.8.1-5~dhx1~precise1))) 

ProcessModel: Default DomainUsage: Single 
Execution Runtime: mono-4.0 
.F.F.. 
Tests run: 4, Errors: 0, Failures: 2, Inconclusive: 0, Time: 0.070971 seconds 
    Not run: 0, Invalid: 0, Ignored: 0, Skipped: 0 

Errors and Failures: 
1) Test Failure : enumErrorTest.Proof.Ctor 
    Expected: MyDefault 
    But was: Wrong 

at enumErrorTest.Proof.Ctor() [0x00000] in <filename unknown>:0 

2) Test Failure : enumErrorTest.Proof.Echo 
    Expected: MyDefault 
    But was: Wrong 

at enumErrorTest.Proof.Echo() [0x00000] in <filename unknown>:0 

回答

0

這實際上是Mono C#編譯器中的一個錯誤。您可以通過指定默認參數參數輕鬆解決該問題。

單聲道版本3.0.3或更高版本應該修復此問題。