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"
非常混乱,故意引入了对语言的重大改变。有什么想法吗?
答案 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#会自动为其指定一个默认值。如果您不想这样,那么您将必须明确定义给定枚举的值。