方法重载解决意外行为
我正在与一个奇怪的,至少对我来说,重载.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)而不是给定的数据类型而不同。
有人能解释一下吗
更新
我应该指出C#2和C#3之间存在不同的行为
Do((long)0) => object overload //C# 2 Do((long)0) => enum overload //C# 3
是 – 常量0可以隐式转换为任何枚举类型。 常量1只能显式转换为枚举类型。 两者都可以隐式转换为object
(通过装箱),但在可用的情况下,首选转换为枚举。
请注意,这与枚举定义的值无关 。 任何非零值的转换都是显式的,无论它是否与枚举中的值匹配。 这只是值0的特殊情况,这使得其他一些代码更简单(特别是在处理标志时)。 我恐怕没有手头的规格来找到参考。
额外的奇怪之处:由于MS编译器中的一个错误(永远不会被修复 – 它会破坏向后兼容性)它实际上是各种零常数 ,而不仅仅是一个整数。 所以Execute(0d)
和Execute(0m)
也会将双Execute(0m)
和小数转换为枚举。 它不适用于每个零常量 – 它取决于源代码的确切性质。 这一切都很奇怪 – 请关注Eric Lippert揭示所有内容的链接……
我同意Jon Skeet的回答 – 请参阅他在1月11日17:32的post(上图)。 要进一步扩展,请参阅C#语言规范 – 第110页
6.1.3隐式枚举转换 隐式枚举转换允许将decimal-integer-literal 0转换为任何枚举类型,并转换为其基础类型为枚举类型的任何可空类型。 在后一种情况下,通过转换为基础枚举类型并包装结果来评估转换(第4.1.10节)。
还是有一个问题:
添加声明:
test.Execute(-0.0); //对象重载:0
同时添加以下内容:
test.Execute(+0.0); // enum重载:0
Jacques Colmenero企业架构师colmeneroj@videotron.ca
Enum刚刚映射到int(默认情况下)。 0不会映射到您的Enum,因此使用了对象的重载。 1映射到您的枚举,因此使用Enum重载。
你可以这样做:
Execute((object) 1);
输出
对象过载:1
上述就是C#学习教程:方法重载解决意外行为分享的全部内容,如果对大家有所用处且需要了解更多关于C#学习教程,希望大家多多关注—计算机技术网(www.ctvol.com)!
本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。
ctvol管理联系方式QQ:251552304
本文章地址:https://www.ctvol.com/cdevelopment/1044194.html