为了说明,我有一个具有不同枚举字段的枚举类 Genre,并且 ToString() 方法在不同场景下会产生不同的结果。
例如,
案例一:
public enum Genre {
A1 = 1, // .ToString() produces "A2"
A2 = A1, // .ToString() produces "A2"
B1 = 2, // .ToString() produces "B1" (Why not "B2"?)
B2 = B1 // .ToString() produces "B1" (Why not "B2"?)
}
案例二:
public enum Genre {
A1 = 1, // .ToString() produces "A2"
A2 = A1, // .ToString() produces "A2"
B1 = 2 // .ToString() produces "B1"
}
案例三:
public enum Genre {
A1 = 1, // .ToString() produces "A1" (Why not "A2"?)
A2 = A1 // .ToString() produces "A1" (Why not "A2"?)
}
以下是我通过 Rider's Immediate Window 完成的实验截图。另一种解决方法是使用
nameof()
,但我们代码库中的主要地方都在使用 ToString()
,我们不想更改它们。
docs状态:
如果多个枚举成员具有相同的底层值,而你 尝试检索枚举的字符串表示形式 成员的名字基于它的潜在价值,你的代码不应该 对方法将返回哪个名称做出任何假设.
如果你查看源代码,你会发现原因是
Enum.ToString
使用 GetEnumName
使用 GetEnumData
使用反射获取所有枚举值的名称,然后使用 Array.BinarySearch
找到第一次匹配。所以你得到什么名字是不可预测的,你不应该依赖它。
如果您必须依赖名称,您应该考虑使用
Dictionary<Genre, string>
或真实的类,例如 FilmGenre
具有 string Name
和也许 Genre Genre
属性。