相关疑难解决方法(0)

方法重载解决意外行为

我正在与一个奇怪的,至少对我来说,重载.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# …
Run Code Online (Sandbox Code Playgroud)

.net c# overloading

17
推荐指数
1
解决办法
640
查看次数

为什么C#3允许将文字零(0)隐式转换为任何枚举?

C#3(Visual Studio 2008)引入了对语言的重大更改(http://msdn.microsoft.com/en-us/library/cc713578.aspx,请参阅更改12),允许将任何文字零隐式转换为一个枚举.这在很多方面都很奇怪.有谁知道为什么这是规范的一部分?为什么不是文字?还是七个?为什么零特殊?并且它使一些非常违反直觉的重载决策选择.例如.

function string F(object o) { return o.ToString(); }
function string F(DbType t) { return t.ToString(); }
int i = 0;
F((long)0) == "String" // would have been "0" in VS 2005
F(0) == "String"
F(i) == "0"
Run Code Online (Sandbox Code Playgroud)

非常混乱,故意引入了对语言的重大改变.有任何想法吗?

c# c#-3.0

9
推荐指数
1
解决办法
723
查看次数

标签 统计

c# ×2

.net ×1

c#-3.0 ×1

overloading ×1