2017-04-04 8 views
4

Ich möchte eine enum für mögliche Sorten machen. Dies ist ein funktionierendes Beispiel:Aufzählung mit int-Wert?

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

Allerdings möchte ich die Noten ganze Zahlen sein, wie

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

Warum hat die erste Arbeit, aber nicht die zweite? Wie kann ich eine ähnliche Variable erstellen, die nur Werte von 1 bis 5 annehmen kann (und nullfähig ist)?

+8

Da eine Ganzzahl keine ** Kennung ** ist. –

+0

Also, wie kann ich eine ähnliche Variable machen, die nur Werte von 1-5 annehmen kann (und Nullable ist)? –

+3

Übrigens ist es nicht wahr, dass eine Variable eines Aufzählungstyps nicht in der Lage ist, Werte zu halten, die nicht in der Aufzählung aufgelistet sind. Sie können alle möglichen verrückten Werte in eine Aufzählung umwandeln. – harold

Antwort

9

Enum-Elemente müssen gültige C# -Kennungen haben; 1, 2, 3 usw. sind keine gültigen C# -Kennzeichen, also nein: das geht nicht. Sie können vielleicht verwenden One = 1 etc, oder einige gemeinsame Präfix (Grade1), aber ...

9

Sie sollten Grade wie folgt angeben.

B, C und so weiter wird nächsten Wert nehmen.

+2

A ++, gutes Denken –

+0

@MarcGravell CS1059 Der Operand eines Inkrement- oder Dekrementoperators muss eine Variable, eine Eigenschaft oder ein Indexer sein –

3

C# erfordert enum Konstanten zu sein Bezeichner, d. H. In einem Buchstaben/Unterstrich beginnen und nur Buchstaben, Unterstriche und Ziffern einschließen.

Sie haben mehrere Möglichkeiten, dies zu beschäftigen:

  • die Zahlen Buchstabieren - dh Grade.One, Grade.Two usw.
  • Präfix die Zahl mit einem Buchstaben oder
  • Präfix der Zahl mit einem unterstreichen.

Meiner Meinung nach ist die erste Option ist die beste, weil es sehr gut liest:

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

Die letzte Option seltsam aussieht, aber wenn Sie Ihre Meinung absolut auf mit Zahlen gesetzt wird, ist dies so nah wie Sie es bekommen kann:

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

wie andere gesagt haben, die Namen, die Sie für Ihre enum von {1, 2, 3, etc} ungültig verwenden möchten, weil sie nicht gültig C# Identifikatoren sind.

Wenn Sie diese Werte aus Ihrem Enum benötigen, können Sie wie folgt vorgehen:

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

Dann, wenn Sie den Wert von etwa zugreifen müssen, Grade.B, Sie, dass wie dies tun können:

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

Beachten Sie, dass, wenn Sie eine Klasse als String, wie „C“ hatte man es in einen Aufzählungswert wie folgt umwandeln könnte:

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

Wie kann ich eine ähnliche Variable erstellen, die nur Werte von 1-5 annehmen kann (und nullfähig ist)?

Ihre eigene Art bilden:

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); 
} 

Jetzt können Sie einen Typ haben, als nur 1 halten kann, 2, 3, 4 und 5 und standardmäßig auf 1. Die Initialisierung ist so einfach wie Grade g = 4;.

Sie brauchen eine Nullwertangabe? Kein Schweiß: Grade? g = 4;.