2012-04-22 85 views
4

我有一个简单枚举:enum.ToString返回错误的值?

public enum MyEnum 
     { 
      [Description("Zero")] 
      Zero, 
      [Description("A positive number")] 
      Positive, 
      [Description("Any integer")] 
      AnyInteger, 
      [Description("A negative number")] 
      Negative, 
      [Description("Reserved number")] 
      Reserved =2 
      } 

然而,运行下面的代码:

MyEnum温度= MyEnum.AnyInteger;

string en = temp.ToString();

将en字符串设置为Reserved。

为什么会发生?

是否有其他的方式来设置字符串到使用的枚举字符串(在这种情况下AnyInteger)?

+2

'MyEnum.AnyInteger == MyEnum.Reserved' – 2012-04-22 13:21:06

回答

5

定义枚举的第一个值开始0时,它从那里往上走,除非你让其他明智的,所以你的情况是:

public enum MyEnum 
     { 
      [Description("Zero")] 
      Zero, //0 
      [Description("A positive number")] 
      Positive, //1 
      [Description("Any integer")] 
      AnyInteger, //2 
      [Description("A negative number")] 
      Negative, //3 
      [Description("Reserved number")] 
      Reserved = 2 // it's 2 again 
      } 

可以定义相同值的两倍(或更多)在枚举中。该ToString具有相同价值找到了一个名字:

MyEnum temp=MyEnum.AnyInteger; //temp = 2 

string en=temp.ToString(); // return the name of the first name with value 2. 
如果你坚持要“保留”的值应为2,把他的顺序正确的地方

。否则删除=2

+0

还有一件事要记住。在你的代码中'(MyEnum.AnyInteger == MyEnum.Reserved)'是真的...... – 2012-04-22 13:30:21

4

发生这种情况是因为您已将保留设置为2.如果要为枚举设置值,则应该全部或全部不执行。

+1

这是完全不正确的。你可以有一些值集。有时候你需要那个。 A - 您可以将第一个值设置为X,所有其他值将自动为X + 1,X + 2 ... B - 如果大多数值与您无关,但您仍希望具有一个特定值。就像这里保留的那样,但是通常不会像9999或其他任何东西那样被改变。 – 2012-04-22 13:50:11

+0

请注意,我没有说你必须全部设置或不设置,我说你应该。这是一项建议,而不是一项任务。我同意你的观点,你可以完全按照莎拉在她的文章中所做的事情做,但是你可以用像这样的小bug来咬人。 – 2012-04-22 13:52:22

+0

对......虽然我仍然不认为这是你应该避免的。请谨慎使用。 – 2012-04-22 13:56:25