希望快点。
这是一个有效的枚举
public enum myEnum
{
a= 1,
b= 2,
c= 3,
d= 4,
e= 5,
f= 6,
g= 7,
h= 0xff
};
但这不是
public enum myEnum
{
1a = 1,
2a = 2,
3a = 3,
};
有没有办法可以在枚举中使用数字。我已经有了代码来填充枚举下拉列表,因此它非常方便
答案 0 :(得分:71)
C#中根本没有标识符可以以数字开头(出于词汇/解析的原因)。考虑在枚举值中添加[Description]属性:
public enum myEnum
{
[Description("1A")]
OneA = 1,
[Description("2A")]
TwoA = 2,
[Description("3A")]
ThreeA = 3,
};
然后你可以从这样的枚举值中得到描述:
((DescriptionAttribute)Attribute.GetCustomAttribute(
typeof(myEnum).GetFields(BindingFlags.Public | BindingFlags.Static)
.Single(x => (myEnum)x.GetValue(null) == enumValue),
typeof(DescriptionAttribute))).Description
根据下面的XSA评论,我想扩展一下如何让它更具可读性。最简单的说,你可以创建一个静态(扩展)方法:
public static string GetDescription(this Enum value)
{
return ((DescriptionAttribute)Attribute.GetCustomAttribute(
value.GetType().GetFields(BindingFlags.Public | BindingFlags.Static)
.Single(x => x.GetValue(null).Equals(value)),
typeof(DescriptionAttribute)))?.Description ?? value.ToString();
}
由您决定是否要将其作为扩展方法,并且在上面的实现中,如果没有提供[DescriptionAttribute]
,我已经使其回退到枚举的正常名称。
现在,您可以通过以下方式获取枚举值的说明:
myEnum.OneA.GetDescription()
答案 1 :(得分:11)
不,没有。 C#不允许标识符以数字开头。
应用程序可用性说明:在您的应用程序中,您不应该向最终用户显示代码标识符。考虑将单个枚举项目翻译成用户友好的可显示文本。迟早你必须使用一个项目来扩展枚举,该项目的标识符不会以用户可以显示的形式显示。
更新:请注意,正在讨论将可显示文本附加到枚举项目的方法,例如here。
答案 2 :(得分:8)
C#(和大多数语言)中的标识符不能以数字开头。
如果您可以修改使用枚举名称填充下拉列表的代码,则可能会在填充下拉列表时删除前导下划线并修改枚举,如下所示:
public enum myEnum
{
_1a = 1,
_2a = 2,
_3a = 3
};
或者,如果你不喜欢下划线,你可以想出你自己的'前缀被剥离'方案(可能将前缀传递给构造函数或方法,它将填充枚举中的下拉列表)。< / p>
答案 3 :(得分:4)
没办法。有效的标识符(即有效的枚举成员)不能以数字开头。
答案 4 :(得分:4)
在命名规则方面,枚举与变量没有什么不同。因此,您无法使用数字启动名称。从this post开始,以下是变量命名的主要规则。
名称可以包含字母,数字和下划线字符 (_)。
名称的第一个字符必须是字母。下划线是 也是一个合法的第一个角色,但它 建议不要使用 一个名字的开头。下划线是 经常与特殊命令一起使用,和 它有时难以阅读。
案件事项(即大写和小写字母)。 C#是 区分大小写;因此,这些名字很重要 和伯特指的是两个不同的 变量
C#关键字不能用作变量名。回想一下关键字 是一个单词,是C#的一部分 语言。 (C#的完整列表 关键字可以在附录B中找到, “C#关键字。”)
答案 5 :(得分:4)
标识符不能以数字开头。但是,它们可以包含数字。
答案 6 :(得分:1)
简短的4行代码。
我们只是将枚举用作代码中项目的命名整数,
所以任何简单的方法都可以。
public enum myEnum
{
_1A = 1,
_2A,
_3A,
};
也用于十进制值
public enum myEnum
{
_1_5 = 1,
_2_5,
_3_5,
};
因此,在代码中使用它时,
int i = cmb1.SelectedIndex(0); // not readable
int i = cmb1.SelectedIndex( (int) myEnum._1_5); // readable
答案 7 :(得分:-2)
以下是我提出的替代方案,我需要在“for”循环中使用Enums以及相当于在Linq查询中使用的字符串表示。
- 创建要在“for”循环中使用的枚举命名空间。
醇>
public enum TrayLevelCodes
{
None,
_5DGS,
_5DG,
_3DGS,
_3DG,
_AADC,
_ADC,
_MAAD,
_MADC
};
- 基于创建用于Linq查询的枚举创建字符串
醇>
public string _5DGS = "\"5DGS\"",
_5DG = "\"5DG\"",
_3DGS = "\"3DGS\"",
_3DG = "\"3DG\"",
_AADC = "\"AADC\"",
_ADC = "\"ADC\"",
_MAAD = "\"MAAD\"",
_MADC = "\"MADC\"";
- 创建将枚举值作为参数的函数,并返回Linq查询的相应字符串。
醇>
public string GetCntnrLvlDscptn(TrayLevelCodes enumCode)
{
string sCode = "";
switch (enumCode)
{
case TrayLevelCodes._5DGS:
sCode = "\"5DGS\"";
break;
case TrayLevelCodes._5DG:
sCode = "\"5DG\"";
break;
case TrayLevelCodes._3DGS:
sCode = "\"3DGS\"";
break;
case TrayLevelCodes._3DG:
sCode = "\"3DG\"";
break;
case TrayLevelCodes._AADC:
sCode = "\"AADC\"";
break;
case TrayLevelCodes._ADC:
sCode = "\"AAC\"";
break;
case TrayLevelCodes._MAAD:
sCode = "\"MAAD\"";
break;
case TrayLevelCodes._MADC:
sCode = "\"MADC\"";
break;
default:
sCode = "";
break;
}
return sCode;
}
- 以下是我使用上面创建的内容。
醇>
for (var trayLevelCode = TrayLevelCodes._5DGS; trayLevelCode <= TrayLevelCodes._MADC; trayLevelCode++)
{
var TrayLvLst = (from i in pair1.Value.AutoMap
where (i.TrayLevelCode == HTMLINFO.GetCntnrLvlDscptn(trayLevelCode))
orderby i.TrayZip, i.GroupZip
group i by i.TrayZip into subTrayLvl
select subTrayLvl).ToList();
foreach (DropShipRecord tray in TrayLvLst)
{
}
}