如何定义一个包含整数值的C#枚举类型?

3

我正在设计一个需要“位置”字段的应用程序。该位置的值为“3241”,“4112”,“ND”和“TRAVEL”,我正在尝试设置一个包含这些值的枚举

我首先开始了

    enum projectLocation {3241,4112,ND,TRAVEL};

但是3241和4112的值表示语法错误——需要标识符——对于enum中第一个值。如果我正确理解了enum,那么这是因为上述语句正在寻找enum整数索引的值32414112。这个假设是正确的吗?

我尝试使用以下方法覆盖它。

    enum projectLocation {3241=0,4112,ND,TRAVEL};

并且

    enum projectLocation {3241=0,4112=1,ND=2,TRAVEL=3};

但是我仍然在3241值上得到相同的语法错误。有趣的是,在这两个语句中,4112没有语法错误,但是我得到了找不到名称空间或名称ND...TRAVEL

很明显,enum不允许混合字符串和整数,我有另外两个enum,它们只是字符串值列表,并且工作正常,证实了这个理论。是否有一种方法可以强制enum将数字值作为字符串接受?我在MSDN的C#文档中没有找到任何参考。

4个回答

6

枚举被称为命名常量,基本上你给一些常量起了一个名称。在C#中,名称是"标识符",标识符可以包含数字,但第一个字符不能是数字。

您可以在此之前添加_来解决此错误。

enum projectLocation 
{
    _3241=0,
    _4112=1,
    ND=2,
    TRAVEL=3
}

还要注意字段、属性、方法或任何归属于上述标识符规则的内容。


2
第一个字符不能是数字。明白了!那很有道理。这就是我要找的语法。谢谢。 - dwwilson66

5
您不能像您尝试的那样完全做到。这里有一个替代方法:
enum projectLocation {
    L3241=3241,
    L4112=4112,
    ND=2,
    TRAVEL=3
}

以字母开头使它们成为有效的枚举标识符,并将它们的值设置为它们的数字,这样您就可以执行类似于 (projectLocation)3241 的操作,并获得预期的 L3241 值。

如果需要在序列化时值为32414112,请根据您的序列化方法包括适当的属性,例如使用Json.NET:

enum projectLocation {
    [JsonProperty("3241")]
    L3241=3241,
    [JsonProperty("4112")]
    L4112=4112,
    ND=2,
    TRAVEL=3
}

3
您需要像这样做:
您需要执行以下操作:
enum projectLocation { v3241, v4112, ND, TRAVEL };

或者:

enum projectLocation { _3241, _4112, ND, TRAVEL };

我的偏好是使用下划线。


这只是将一个字符串字符添加为值的第一个字符,以强制C#将该值识别为字符串,还是有一些我不知道的保留字符?由于这些数字代表两个不同的建筑地址...3241大楼和4112大楼,3241BLDG4112BLDG将是更相关于客户端的数据值。 - dwwilson66

1

C#不允许成员名称的第一个字符以数字开头。考虑使用@字符作为前缀,或者其他传达代码含义的字符。因为在孤立的数字情况下,数字对于不熟悉上下文中3241意义的读者来说可能不太直观。


1
@具有特殊含义,不能像@3241一样在此处使用。 - Tim S.
@TimS 啊,你说得对,我之前并不知道这点。我以为它适用于所有成员名称。那么今天我学到了新东西!我以前从未遇到过这种情况,就像我建议的那样,我会在枚举成员的第一个位置使用一个描述性的英文名来规避这个问题。 - Martin Costello
对于这个特定的客户,3241和4112是他们用于两栋独立建筑物的名称,并且对他们非常有意义。基于成员名称不能以数字开头(今天我学到的新知识),"BLDG3241"和"BLDG4112"将成为枚举成员名称。 - dwwilson66

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接