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

时间:2010-11-26 11:13:08

标签: 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

    }
}

您在DoSomething行上收到错误:

  

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

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

3 个答案:

答案 0 :(得分:16)

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

  

13.1.3隐式枚举转换

     

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

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

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

答案 1 :(得分:8)

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

因此,在第一种情况下,0“同等”可转换为int?MyEnum。这两种转换都不比其他转换“更好”,因此编译器不知道您希望调用哪种方法。

如果您将0更改为1,那么它可行,因为1 可以隐式转换为MyEnum,因此唯一匹配方法是采用int?参数的方法。

答案 2 :(得分:0)

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