我不同意其他答案陈述
...这不能保证...
...你不能依赖那个...
以及用msdn声明:
...您的应用程序代码不应依赖于返回特定成员名称的方法...
故事
我的软件中有一个枚举
enum Blabla { A = 0, B = 1, C = 2, D = 3 }
在某些时候A 值更改为AA,随后AA 更改为AAA。为了保持向后兼容性,我必须这样做
enum Blabla { A = 0, AA = 0, AAA = 0, B = 1, C = 2, D = 3 }
这允许将旧的枚举值(由旧版本的软件生成)反序列化为AAA。
然后有一个打印Blabla设置值的报告。在某些时候,每个使用新版本的客户都会开始告诉我,他们看到的不是AAA,而是AA 的价值。他们都看到了AA(没有人报告看到A)。
我做了什么?我只是改变了顺序(直到结果是AAA)
enum Blabla { AAA = 0, A = 0, AA = 0, ...}
并进行了测试以确保Blabla.AAA 将输出为AAA。问题解决了吗?
证明
查看Enum.ToString()(或Enum.GetName())的来源,它使用GetEnumName(),它调用Array.BinarySearch() 对值的排序数组以查找值的索引。
二分查找的结果是确定性的:为它提供相同的参数将返回相同的结果。
所以:
- 如果您不更改枚举,那么结果将是相同的。
- 可以通过实验找到结果(或者通过了解binary search 的工作原理以及枚举的处理方式)。
- 没有简单的规则来确定结果(例如,您不能说“它总是返回第一个定义的值”)。
- 不太可能更改
enum 的格式(例如,定义顺序和值列表的顺序不同)或Enum.ToString() 将更改,但它可能会发生,因此请确保您对依赖的情况进行了测试返回值。