我之前遇到了一个奇怪的问题,我在一个新的控制台应用程序中复制了这个问题.我想知道,任何人都能解释为什么会这样吗?
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 },上面仍然适用.请记住,所有枚举都可以包含其基础整数类型的所有值,并且不限于实际声明的值.
这是因为文字0可以隐式转换为任何文字enum.
因此,在第一种情况下,0"同等"可转换为int?或者MyEnum.两种转换都不比另一种"更好",因此编译器不知道您期望调用哪种方法.
如果你改变0为a 1然后它可以工作,因为1它不能隐式转换为MyEnum,所以唯一匹配的方法是接受int?参数的方法.