C# 中不一致的 Enum.ToString() 行为

问题描述 投票:0回答:1

为了说明,我有一个具有不同枚举字段的枚举类 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()
,我们不想更改它们。

Case 1

Case 2

Case 3

c# enums tostring
1个回答
1
投票

docs状态:

如果多个枚举成员具有相同的底层值,而你 尝试检索枚举的字符串表示形式 成员的名字基于它的潜在价值,你的代码不应该 对方法将返回哪个名称做出任何假设.

如果你查看源代码,你会发现原因是

Enum.ToString
使用
GetEnumName
使用
GetEnumData
使用反射获取所有枚举值的名称,然后使用
Array.BinarySearch
找到第一次匹配。所以你得到什么名字是不可预测的,你不应该依赖它。

如果您必须依赖名称,您应该考虑使用

Dictionary<Genre, string>
或真实的类,例如
FilmGenre
具有
string Name
和也许
Genre Genre
属性。

© www.soinside.com 2019 - 2024. All rights reserved.