如何让enum包含短划线( – )?

我正在使用Enterprise Architect从此模式生成业务对象。

该架构具有以下枚举规范:

               

企业架构师生成以下代码,但Visual Studio不喜欢CD-ROM中的破折号( – ),也不会编译。

 public enum PackageMedium : int { NTP, DAT, Exabyte, CD-ROM, DLT, D1, DVD, BD, LTO, LTO2, LTO4 } 

我能做些什么来完成这项工作?


基于@Craig Stuntz回答我能找到这篇文章 ,帮助我从Enum中检索这些特殊字符。

你不能。 完全停止。 但是,有一些解决方法。 例如,您可以使用DescriptionAttribute

 public enum PackageMedium : int { NTP, DAT, Exabyte, [Description("CD-ROM")] CDROM, DLT, D1, DVD, BD, LTO, LTO2, LTO4 } 

遗憾的是,这意味着在映射值时您还有更多工作要做。 另一方面,它至少可以编译。

如果您不喜欢,请选择另一种解决方法,例如字典:

 var dict = Enum.GetValues(typeof(PackageMedium)) .Cast() .Select(v => Tuple.Create(v == PackageMedium.CDROM ? "CD-ROM" : v.ToString(), v)) .ToDictionary(t => t.Item1, t => t.Item2); var myEnumVal = dict["CD-ROM"]; 

简答:没有。

原因在于-字符被词法分子用作其他目的的标记,例如表示二元和一元减运算符。

最好的办法是删除-或者用标识符名称中有效字符的其他字符替换它。 您通常可以使用的唯一非字母字符是_

您可以在C#规范中找到更多信息。

AC#标识符必须以下划线开头,Unicode类Lu,Ll,Lt,Lm,Lo或Nl中的字符,或其中一个字符的转义符。 所有其他字符必须来自Unicode类Lu,Ll,Lt,Lm,Lo,Nl,Mn,Mc,Nd,Pc或Cf,或者其中之一的转义。

连字符是Pd类。

如果C#允许它,如果你需要符合CLS,你仍然无法在公共标识符上使用它,因为它也不适合它的规则。

这也是如此,你是如何区分CD-ROM意味着enum的特定项目与CD-ROM意味着将-运算符与CD作为左手操作数并将ROM作为右手操作数应用?

如果可能性列表是硬编码的,我只需删除连字符减号并将CDROM作为标签。 如果它不是硬编码我会使用字典,因为它更具弹性,面对更多不能作为标识符的情况。