具有int值的枚举?

时间:2017-04-04 13:33:25

标签: c# enums

我想为可能成绩制作enum。这是一个有效的例子:

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

但是,我希望成绩是整数,比如

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

为什么第一个工作但不是第二个工作?如何创建一个类似的变量只能取值1-5(并且可以为空)?

5 个答案:

答案 0 :(得分:9)

枚举元素需要有有效的C#标识符; 123等不是有效的C#标识符,因此不会:您无法做到这一点。您也许可以使用One = 1等,或者使用一些公共前缀(Grade1),但是......

答案 1 :(得分:9)

您应该像这样指定Grade

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

B,C等将采用下一个值。

答案 2 :(得分: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
}

答案 3 :(得分:0)

正如其他人所说,您要用于枚举{1, 2, 3, etc}的名称无效,因为它们不是有效的C#标识符。

如果您需要这些值,请执行以下操作:

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

然后,当您需要访问say,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

答案 4 :(得分:0)

  

如何制作一个类似的变量,只能取值1-5(并且可以为空)?

制作自己的类型:

var result = customClassList.GroupBy(x => new {x.FirstField, x.SecondField})
                            .Select(x => x.OrderByDescending(y => y.ThirdField).First());

现在您的类型不仅可以包含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); } 1234,而且默认为5。初始化就像1一样简单。

你需要它可以为空吗?没有汗水:Grade g = 4;