2017-04-04 95 views
4

我想爲可能的成績製作enum。這是一個工作示例:使用int值枚舉?

public enum Grade 
{ 
    A, B, C, D, E, F 
} 

但是,我想成績是整數,像

public enum Grade 
{ 
    1, 2, 3, 4, 5 
} 

爲什麼第一個工作,但不是第二個?我怎樣才能做出一個類似的變量,只能取值爲1-5(可爲空)?

+8

因爲整數不是**標識**。 –

+0

那麼我怎樣才能做出一個類似的變量,只能取值從1-5(可爲空)? –

+3

順便說一句,一個枚舉類型的變量不能保存枚舉中未列出的值,您可以將各種瘋狂的值轉換爲一個枚舉。 – harold

回答

9

枚舉元素需要有效的C#標識符; 1,2,3等都不是有效的C#標識符,所以不行:你不能這樣做。你也許可以用One = 1等,或者一些常用的前綴(Grade1),但是...

9

你應該這樣指定Grade

public enum Grade 
{ 
    A = 1, 
    B, 
    C, 
    D, 
    E, 
    F 
} 

B,C等會取下一個值。

+2

A ++,好想法 –

+0

@MarcGravell CS1059增量或減量運算符的操作數必須是變量,屬性或索引器 –

3

C#要求enum常數是標識符,即,在以字母開頭/下劃線,和僅包括字母,下劃線和數字。

你有多種選擇來應對這樣的:

  • 拼寫出數字 - 即Grade.OneGrade.Two
  • 前綴以字母數字,或
  • 前綴與數下劃線。

在我看來,第一個選項是最好的,因爲它讀取非常好:

enum Grade { 
    One = 1 
, Two 
, Three 
, Four 
, Five 
} 

最後一個選項看起來很奇怪,但如果你下定決心使用數字上是絕對設置,這是接近你可以得到它:

enum Grade { 
    _1 = 1 // Without =1 the value of _1 would be zero 
, _2 
, _3 
, _4 
, _5 
} 
0

正如其他人所說,你想用你的{1, 2, 3, etc}枚舉的名稱是無效的,因爲他們沒有有效的C#標識符。

如果你需要這些值你的枚舉,你可以做到以下幾點:

// Declare enum 
public enum Grade 
{ 
    A = 1, 
    B, 
    C, 
    D, 
    F 
} 

然後,當你需要訪問的值,例如,Grade.B,可以是這樣做的:

int theIntGrade = (int)Grade.B // after this line, theIntGrade will be equal to 2 

請注意,如果你有一個等級爲一個字符串,如「C」,你可以把它轉換成一個枚舉值如下:

Grade theLetterGrade = (Grade)Enum.Parse(typeof(Grade), "C", true); // final parameter sets case sensitivity for comparison 
0

我怎樣才能做一個類似的變量,只能取值從1-5(和可爲空)?

使自己的類型:

public struct Grade: IEquatable<Grade> 
{ 
    private int innerValue; 
    private int InnerValue => isInitialized ? innerValue : 1; 
    private readonly bool isInitialized; 

    private Grade(int value) 
    { 
     if (value < 1 || value > 5) 
      throw new OverflowException(); 

     innerValue = value; 
     isInitialized = true; 
    } 

    public static implicit operator Grade(int i) => new Grade(i); 
    public static explicit operator int(Grade g) => g.InnerValue; 
    public override bool Equals(object obj) => obj is Grade && Equals((Grade)obj); 
    public bool Equals(Grade other) => InnerValue == other.InnerValue; 
    public override int GetHashCode() => InnerValue.GetHashCode(); 
    public override string ToString() => InnerValue.ToString(); 
    public static bool operator ==(Grade left, Grade right) => left.Equals(right); 
    public static bool operator !=(Grade left, Grade right) => !left.Equals(right); 
} 

現在你有一個類型不是隻可容納12345,默認爲1。初始化它就像Grade g = 4;一樣簡單。

你需要它可以爲空嗎?沒有汗水:Grade? g = 4;