2012-04-22 123 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