是标志枚举的字符串表示中定义的值的顺序

时间:2014-09-29 19:08:14

标签: c# enums

[flags]
enum Test
{
  a=0,
  b=1,
  c=2
}
...
var v = Test.c | Test.b;
var str = v.ToString();
// str = 'b, c'

是'str'中定义的值的顺序。 b,c和c,b在语义上都是相同的,在语法上是不同的。我为什么关心 - 我正在编写测试代码(不是在c#中)更喜欢不需要花哨的逻辑解析所有可能的组合

1 个答案:

答案 0 :(得分:5)

documentation for Enum.ToString

  

如果应用FlagsAttribute并且有一个或多个命名常量的组合等于此实例的值,则返回值是一个字符串,其中包含以分隔符分隔的常量名称列表。

它没有指明它们将以什么顺序显示。

执行格式化的代码(请参阅参考源中的函数InternalFlagsFormat,此处:http://referencesource.microsoft.com/#mscorlib/system/enum.cs)似乎始终以相同的方式工作。

但是,由于订单没有记录,您必须自己判断改变的可能性。过去因为假设事情不会发生变化而被焚烧,我真的很谨慎依赖于没有明确记录的事情。

OP编辑:代码中有一个有趣的注释,用于格式化输出

 // These values are sorted by value. Don't change this
    String[] names;
    ulong[] values;

这表明枚举名称将按照枚举值的顺序出现。虽然如你所说 - 从版本到版本不保证