如何在C#中解析不明确的枚举值?

on顿罗斯伯勒

我检查了C#语言规范中有关枚举的部分,但无法解释以下代码的输出:

enum en {
    a = 1, b = 1, c = 1,
    d = 2, e = 2, f = 2,
    g = 3, h = 3, i = 3,
    j = 4, k = 4, l = 4
}

en[] list = new en[] {
    en.a, en.b, en.c,
    en.d, en.e, en.f,
    en.g, en.h, en.i,
    en.j, en.k, en.l
};
foreach (en ele in list) {
    Console.WriteLine("{1}: {0}", (int)ele, ele);
}

它输出:

c: 1
c: 1
c: 1
d: 2
d: 2
d: 2
g: 3
g: 3
g: 3
k: 4
k: 4
k: 4

现在,为什么要选择第三个“ 1”,第一个“ 2”和“ 3”,但选择第二个“ 4”?这是未定义的行为,还是我遗漏了一些明显的东西?

拉瑟诉卡尔森

专门记录这是未记录的行为。

编写代码的方式可能最终会每次都选择相同的东西,但是Enum.ToString文档指出:

如果多个枚举成员具有相同的基础值,并且您尝试根据其基础值来检索枚举成员名称的字符串表示形式,则您的代码不应对方法将返回的名称进行任何假设。

(我的重点)

如评论中所述,不同的.NET运行时可能返回不同的值,但是未记录行为的整个问题是,它很容易无缘无故地(似乎)被更改。它可能会根据天气,时间,程序员的心情甚至在.NET运行时的修补程序中进行更改。您不能依赖未记录的行为

请注意,在您的示例中,ToString正是您要查看的内容,因为您正在打印该值,这随后会将其转换为字符串。

如果您尝试进行比较,则所有具有相同基础数字值的枚举值都是等效的,并且您无法首先确定存储在变量中的枚举值。

换句话说,如果您这样做:

var x = en.a;

之后没有办法推断出您写的内容是否en.a与否,en.b或者en.c它们都比较相等,因此它们都具有相同的潜在价值。好吧,没有创建一个程序来读取自己的源代码。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何在c#中删除不明确的方法调用

来自分类Dev

如何在 Scala 中解决不明确的隐式值以在 Play Json 中解析 JSON?

来自分类Dev

熊猫:如何解析系列的真值尚不明确

来自分类Dev

C ++重载解析度不明确-GCC

来自分类Dev

atof()返回不明确的值

来自分类Dev

如何在F#中调用C#枚举的值

来自分类Dev

语法不明确或不明确

来自分类Dev

语法不明确或不明确

来自分类Dev

Java中的类名不明确

来自分类Dev

在oracle中定义不明确的列

来自分类Dev

程序中的指针缺陷不明确

来自分类Dev

SQL查询中列名不明确

来自分类Dev

类型类默认方法实例中的类型解析不明确

来自分类Dev

获取不明确的对

来自分类Dev

真值不明确

来自分类Dev

运算符'+'在类型'ulong'和'int'(C#)的操作数上不明确

来自分类Dev

系列的真实值是不明确的。如何解决此错误?

来自分类Dev

无法删除数据帧 python 3 中的行。值错误:真值不明确

来自分类Dev

如何在 Kotlin 中指向名称不明确的变量?(这个,标签或使用其他东西)

来自分类Dev

不明确的ANTLR解析器规则

来自分类Dev

解析json时对成员'subscript'的不明确引用

来自分类Dev

如何在C#中声明枚举

来自分类Dev

如何在C#中解析多个元素属性值

来自分类Dev

如何在C#中解析oracle tnsname值?

来自分类Dev

Qt项目C2872错误,生成的ui文件中的符号不明确

来自分类Dev

布局不明确-“图片视图的高度不明确”

来自分类Dev

布局不明确-“图片视图的高度不明确”

来自分类Dev

当视图布局不明确时,如何使iOS应用崩溃?

来自分类Dev

Python:如何检查日期是否不明确?