【发布时间】:2018-10-21 09:21:56
【问题描述】:
我写了代码:
enum FlipRotate2dEnum : byte {
NO = 0, None = 0,
R2 = 1, RotateTwice = 1,
FX = 2, FlipX = 2,
FY = 3, FlipY = 3,
D1 = 4, ReflectDiagonal1 = 4,
D2 = 5, ReflectDiagonal2 = 5,
RC = 6, RotateClockwise = 6,
RN = 7, RotateNonClockwise = 7
}
class EnumTest {
public static void Main() {
for(byte i = 0; i < 8; ++i) {
FlipRotate2dEnum v = (FlipRotate2dEnum)i;
System.Console.WriteLine("{0} {1}", i, v);
}
}
}
我希望在输出中看到:
只有简称
0 NO
1 R2
2 FX
3 FY
4 D1
5 D2
6 RC
7 RN
或只有长名称
0 None
1 RotateTwice
2 FlipX
3 FlipY
4 ReflectDiagonal1
5 ReflectDiagonal2
6 RotateClockwise
7 RotateNonClockwise
或按字母顺序排序后首先出现的名称,在这种情况下与“仅短名称”一致。
但我没想到看到程序显示了什么:
0 None
1 RotateTwice
2 FlipX
3 FlipY
4 ReflectDiagonal1
5 ReflectDiagonal2
6 RotateClockwise
7 RN
输出末尾的短名称。 ¿ 为什么?
我试图重新排列枚举中的列:
public enum FlipRotate2dEnum : byte {
None = 0, NO = 0,
RotateTwice = 1, R2 = 1,
FlipX = 2, FX = 2,
FlipY = 3, FY = 3,
ReflectDiagonal1 = 4, D1 = 4,
ReflectDiagonal2 = 5, D2 = 5,
RotateClockwise = 6, RC = 6,
RotateNonClockwise = 7, RN = 7
}
class EnumTest {
public static void Main() {
for(byte i = 0; i < 8; ++i) {
FlipRotate2dEnum v = (FlipRotate2dEnum)i;
System.Console.WriteLine("{0} {1}", i, v);
}
}
}
我再次在输出中得到惊喜:
0 NO
1 R2
2 FX
3 FY
4 D1
5 D2
6 RC
7 RotateNonClockwise
¿ 为什么? 请向我解释这里发生了什么。
【问题讨论】:
-
来自documentation:如果多个枚举成员具有相同的基础值,并且您尝试根据其基础值检索枚举成员名称的字符串表示形式,您的代码不应使关于该方法将返回哪个名称的任何假设。
-
最好使用
[Description]属性并创建一个方法来检索给定枚举值中包含的值。 -
正如 john 所建议的 [Description] 将是这里最合适的解决方案,但无论如何您仍然无法使用它。您可以使用
const偏移量来区分两个值。喜欢None = 0, NO = ConstCarrier.Offset + 0,
标签: c# .net enums type-conversion explicit-conversion