我之前遇到了一个奇怪的问题,我在新的控制台应用程序中复制了这个问题。我想知道,有人可以解释为什么会这样吗?
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)'
但是,如果将零更改为任何其他数字,则不存在此类问题。
答案 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转换为任何枚举类型。