任何人都能解释这个有趣的C#问题吗?

Nib*_*Pig 9 c#

我之前遇到了一个奇怪的问题,我在一个新的控制台应用程序中复制了这个问题.我想知道,任何人都能解释为什么会这样吗?

    static void Main(string[] args)
    {
        DoSomething(0);

        Console.Read();
    }

    public static void DoSomething(int? value)
    {
        Console.WriteLine("Do Something int? called");
    }

    public static void DoSomething(MyEnum value)
    {
        Console.WriteLine("Do Something MyEnum called");
    }

    public static enum MyEnum : int
    {
        test

    }
}
Run Code Online (Sandbox Code Playgroud)

您在DoSomething行上收到错误:

错误1以下方法或属性之间的调用不明确:'DoSomething(int?)'和'DoSomething(MyEnum)'

但是,如果将零更改为任何其他数字,则不存在此类问题.

Tim*_*mwi 16

C#语言规范声明存在从整数文字0到任何枚举类型的隐式转换:

13.1.3隐式枚举转换

隐式枚举转换允许将decimal-integer-literal 0转换为任何枚举类型.

因此,任何其他整数文字只能转换为int?并且因此是明确的; 但是文字0可以转换为int?你和你的枚举.

枚举中定义了哪些值无关紧要.即使你有类似的枚举enum Test { Cats=7 },上面仍然适用.请记住,所有枚举都可以包含其基础整数类型的所有值,并且不限于实际声明的值.


Luk*_*keH 8

这是因为文字0可以隐式转换为任何文字enum.

因此,在第一种情况下,0"同等"可转换为int?或者MyEnum.两种转换都不比另一种"更好",因此编译器不知道您期望调用哪种方法.

如果你改变0为a 1然后它可以工作,因为1不能隐式转换为MyEnum,所以唯一匹配的方法是接受int?参数的方法.