【问题标题】:Is C# enum ToString() guaranteed to return enum name?C# enum ToString() 是否保证返回枚举名称?
【发布时间】:2015-01-16 13:43:22
【问题描述】:
enum Flags
{
  Foo,
  Bar
}

Flags.Foo.ToString() 是否保证返回“Foo”?还是我必须使用 Enum.GetName(...)?

【问题讨论】:

  • 你尝试的时候发生了什么?
  • 他如何尝试保证永远是结果?
  • 不保证您是否有多个名称具有相同的值例如:enum Beer { Empty=0, None=0, HomeBrew=1, Bud=2, Budwizer=2, Budweiser=2, Case=24 } Beer.Bud.ToString() 可能会返回任何具有相同值的名称。

标签: c# enums tostring


【解决方案1】:

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

但要小心这样的情况:

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 在 cmets 中指出的那样,如果值不明确,即如果多个枚举项可以匹配该值,则您不应该对将选择哪一项做出任何假设。

【讨论】:

  • 如果多个枚举成员具有相同的基础值,并且您尝试根据其基础值检索枚举成员名称的字符串表示形式......您的代码不应对哪个字符串将是任何假设回来。 msdn.microsoft.com/fr-fr/library/a0h36syw(v=vs.110).aspx
【解决方案2】:

返回值使用通用格式说明符(“G”)进行格式化。也就是说,如果 FlagsAttribute 没有应用于这个枚举类型并且有一个与这个实例的值相等的命名常量,那么返回值是一个包含常量名称的字符串。如果应用了 FlagsAttribute 并且有一个或多个命名常量的组合等于此实例的值,则返回值是一个字符串,其中包含以定界符分隔的常量名称列表。否则,返回值为该实例的数值的字符串表示形式。

来自MSDN

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-09-11
    • 1970-01-01
    • 2021-08-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-31
    相关资源
    最近更新 更多