方法重载解决意外行为我写了一个小样本来重现这个问题:classProgram{staticvoidMain(string[]args){vartest=newOverloadTest();测试。执行(0);测试。执行(1);控制台.ReadLine();}}publicclassOverloadTest{publicvoidExecute(objectvalue){Console.WriteLine("objectoverload:{0}",value);}publicvoidExecute(MyEnumvalue){Console.WriteLine("enumoverload:{0}",value);}}publicenumMyEnum{First=1,Second=2,Third=3}将打印:enumoverload:0objectoverload:1基本上,使用值(0,1)调用重载而不是针对给定的数据类型进行区分。有人可以解释一下更新我应该指出C#2和C#3之间存在不同的行为Do((long)0)=>对象重载//C#2Do((long)0)=>枚举重载//C#3是——常量0可以隐式转换为任何枚举类型。常量1只能显式转换为枚举类型。两者都可以隐式转换为对象(通过装箱),但在可用的情况下首选转换为枚举。请注意,这与枚举定义的值无关。任何非零值的转换都是显式的,无论它是否与枚举中的值匹配。这只是值0的特例,它使其他一些代码更简单(尤其是在处理标志时)。恐怕我手头没有规格,无法找到参考。额外的奇怪之处:由于MS编译器中的一个错误(永远不会被修复-它破坏了向后兼容性)它实际上是各种零常量,而不仅仅是一个整数。所以Execute(0d)和Execute(0m)也会将doubleExecute(0m)和小数转换为枚举。它不适用于每个零常量——它取决于源代码的确切性质。这一切都很奇怪-点击EricLippert揭示一切的链接......我同意JonSkeet的回答-请参阅他在1月11日17:32发布的帖子(上文)。如需进一步扩展,请参阅C#语言规范-第110页6.1.3隐式枚举转换隐式枚举转换允许将decimal-integer-literal0转换为任何枚举类型,并将其基础类型转换为枚举类型的任何可为空类型的枚举类型。在后一种情况下,通过转换为基础枚举类型并包装结果来评估转换(第4.1.10节)。还有一个问题:添加语句:test.Execute(-0.0);//对象重载:0还要添加以下内容:test.Execute(+0.0);//enumoverload:0JacquesColmeneroEnterpriseArchitectcolmeneroj@videotron.caEnum仅映射到int(默认情况下)。0不映射到您的枚举,因此使用对象的重载。1映射到您的枚举,因此使用枚举重载。你可以这样做:Execute((object)1);输出对象重载:1以上就是《C#学习教程:方法重载解决意外行为共享》的全部内容,如果对大家有用,需要进一步了解C#学习教程,希望大家多多关注——本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处:
