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

时间:2009-10-27 19:36:42

标签: c# 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"

非常混乱,故意引入了对语言的重大改变。有什么想法吗?

5 个答案:

答案 0 :(得分:10)

C#始终允许将文字0隐式转换为任何枚举值。更改的是规则如何应用于其他常量表达式。它被设置为更加一致,并允许任何计算结果为0的常量表达式可以隐式转换为枚举。

您给出的示例在所有C#版本中产生相同的行为。

以下是更改行为的示例(直接来自linked documentation

public enum E
{
    Zero = 0,
    One = 1,
} 

class A
{
    public static A(string s, object o)
    { System.Console.WriteLine("{0} => A(object)", s); } 

    public static A(string s, E e)
    { System.Console.WriteLine("{0} => A(Enum E)", s); }

    static void Main()
    {
        A a1 = new A("0", 0);
        A a3 = new A("(int) E.Zero", (int) E.Zero);
    }
}

Visual C#2005输出:

0 => A(Enum E)
(int) E.Zero => A(object)

Visual C#2008输出:

0 => A(Enum E)
(int) E.Zero => A(Enum E)

答案 1 :(得分:4)

我猜这是因为0被认为是枚举的“默认值”。

C#(在C#2.0中引入了默认关键字)

enum DbType {
    Unspecified,
    SqlServer
}

DbType t;
int i = 0;

Console.WriteLine(t == i);
Console.WriteLine(i == default(DbType));

输出:

True
True

答案 2 :(得分:2)

自版本1.0以来已被允许。它是枚举的默认值。

  

“字面值0可隐式转换   任何枚举类型。在Visual C#2005中   和早期版本的编译器,   还有一些常数   评估为0的表达式   可以隐式转换为任何枚举   类型,但确定的规则   这些表达中的哪一个是   敞篷车尚不清楚。在Visual C#中   2008年,所有常数表达式   等于0可以隐含   转换为任何枚举类型。“

答案 3 :(得分:0)

“枚举元素的默认基础类型是int。默认情况下,第一个枚举数的值为0,每个连续枚举数的值增加1”。 - 这来自MSDN notes for 1.1 framework,所以情况一直如此。

答案 4 :(得分:0)

正如其他人所提到的,0是默认的枚举。尝试按如下方式考虑枚举(以更明确的方式):

public enum HairColor
{
    Blonde           = 0x0000;
    Brunett          = 0x0001;
    Red              = 0x0002;
    StrawberryBlonde = 0x0004;
}

因为您没有明确表示给定枚举的值,所以C#会自动为其指定一个默认值。如果您不想这样,那么您将必须明确定义给定枚举的值。