C#枚举ToString()方法是否保证返回枚举名称?

9
enum Flags
{
  Foo,
  Bar
}
< p > Flags.Foo.ToString() 是否保证返回 "Foo"?还是我需要使用 Enum.GetName(...)?


3
你尝试过它后发生了什么? - thecoop
8
他尝试如何能保证这总是结果? - David Pfeffer
如果同一个值有多个名称(例如enum Beer{Empty=0,None=0,HomeBrew=1,Bud=2,Budwizer=2,Budweiser=2,Case=24}),则无法保证调用Beer.Bud.ToString()会返回哪个名称。 - Mark Schultheiss
2个回答

16

如果枚举值恰好与枚举项匹配,那么是的。

但要注意这种情况:

var test = (Flags)(-1);
// test.ToString() == "-1"

如果值不匹配枚举项,它将只作为字符串返回底层的值。默认情况下,枚举的底层数据类型是 int

此外,如果您的枚举定义了类似于这样的 [Flags]:

[Flags]
enum Flags
{
    Foo = 1,
    Bar = 2
}

然后ToString()可以返回一个逗号分隔的标志列表:

var test = Flags.Foo | Flags.Bar;
// test.ToString() == "Foo, Bar"

正如Orace在评论中指出的那样,如果值是有歧义的,也就是说,如果多个枚举项可以匹配该值,则不应做出任何关于哪一个将被选择的假设。


2
如果多个枚举成员具有相同的基础值,并且您尝试根据其基础值检索枚举成员名称的字符串表示形式...则您的代码不应做出任何关于将返回哪个字符串的假设。 - Orace

5
返回值使用通用格式说明符(“G”)进行格式化。也就是说,如果未将FlagsAttribute应用于此枚举类型,并且存在与此实例的值相等的命名常量,则返回值是包含常量名称的字符串。如果应用了FlagsAttribute,并且存在一个或多个命名常量的组合等于此实例的值,则返回值是包含常量名称的分隔符分隔列表的字符串。否则,返回值是此实例的数字值的字符串表示形式。
来自MSDN

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接