我正在努力解决 .net 的一个奇怪的方法重载解析,至少对我来说是这样。我写了一个小样本来重现该问题:
class Program
{
static void Main(string[] args)
{
var test = new OverloadTest();
test.Execute(0);
test.Execute(1);
Console.ReadLine();
}
}
public class OverloadTest
{
public void Execute(object value)
{
Console.WriteLine("object overload: {0}", value);
}
public void Execute(MyEnum value)
{
Console.WriteLine("enum overload: {0}", value);
}
}
public enum MyEnum
{
First = 1, Second = 2, Third = 3
}
将打印:
enum overload: 0
object overload: 1
基本上,调用的重载根据值 (0, 1) 而不是给定的数据类型而有所不同。
有人可以解释一下吗?
Update
我应该指出 C# 2 和 C# 3 之间存在不同的行为
Do((long)0) => object overload //C# 2
Do((long)0) => enum overload //C# 3
是的 - 常数 0 是隐含地可转换为任何枚举类型。常数 1 仅为明确地可转换为枚举类型。两者都可以隐式转换为object
(通过装箱)但在可用的情况下,首选转换为枚举。
请注意,这有nothing处理枚举定义的值。任何非零值的转换都是显式的,无论它是否与枚举中的值匹配。这只是值 0 的一个特殊情况,这使得其他一些代码更简单(特别是在处理标志时)。恐怕我手头没有规格来查找参考。
额外的奇怪之处:由于 MS 编译器中的一个错误(永远不会被修复 - 它会破坏向后兼容性),它实际上是各种零常数 http://blogs.msdn.com/ericlippert/archive/2006/03/29/the-root-of-all-evil-part-two.aspx,而不仅仅是一个整数。所以Execute(0d)
and Execute(0m)
也会将双精度数和十进制数转换为枚举。它不适合every零常数 - 它取决于源代码的确切性质。这一切都很奇怪——点击埃里克·利珀特 (Eric Lippert) 揭示一切的链接......
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)