为什么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" 

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

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

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

以下是更改行为的示例(直接来自链接文档 )

 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(枚举E)
 (int)E.Zero => A(对象) 

Visual C#2008输出:

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

我猜这是因为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 

从1.0版开始就允许它。 它是枚举的默认值。

“文字0可以隐式转换为任何枚举类型。在Visual C#2005和早期版本的编译器中,还有一些常量表达式可以计算为0,可以隐式转换为任何枚举类型,但是规则决定了哪些枚举类型表达式是可转换的还不清楚。在Visual C#2008中,所有等于0的常量表达式都可以隐式转换为任何枚举类型。“

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

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

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

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