1

ジェネリック クラス内で定義されたデフォルト値の列挙型で奇妙な動作が発生しました。MS .NET 4.0 はデフォルト値を使用しますが、mono は最初の列挙型定義 (ゼロ値) にフォールバックするようです。

私はちょっとしたテストを書きました。それは MS .NET でのみ正しく動作しますが、mono では動作しません。

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
4

1 に答える 1

0

これは実際には Mono C# コンパイラのバグです。デフォルトのパラメーター引数を指定することで、簡単に回避できます。

Mono バージョン 3.0.3 以降では、この問題が修正されているはずです。

于 2013-01-04T15:03:05.917 に答える