iac*_*are 17 .net c# overloading
我正在与一个奇怪的,至少对我来说,重载.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
}
Run Code Online (Sandbox Code Playgroud)
将打印:
enum overload: 0
object overload: 1
Run Code Online (Sandbox Code Playgroud)
基本上,调用的重载因值(0,1)而不是给定的数据类型而不同.
有人能解释一下吗
更新
我应该指出C#2和C#3之间存在不同的行为
Do((long)0) => object overload //C# 2
Do((long)0) => enum overload //C# 3
Run Code Online (Sandbox Code Playgroud)
Jon*_*eet 16
是 - 常量0可隐式转换为任何枚举类型.常量1只能显式转换为枚举类型.两者都可以隐式转换为object(通过装箱),但在可用的情况下,首选转换为枚举.
请注意,这与枚举定义的值无关.任何非零值的转换都是显式的,无论它是否与枚举中的值匹配.它只是值0的特殊情况,这使得其他一些代码更简单(特别是在处理标志时).我恐怕没有手头的规格来找到参考.
额外的奇怪之处:由于MS编译器中的一个错误(永远不会被修复 - 它会破坏向后兼容性)它实际上是各种零常数,而不仅仅是一个整数.所以Execute(0d),Execute(0m)也会将双精度和小数转换为枚举.它不适用于每个零常量 - 它取决于源代码的确切性质.这一切都很奇怪 - 请关注Eric Lippert揭示所有内容的链接......
| 归档时间: |
|
| 查看次数: |
640 次 |
| 最近记录: |