为什么我们不能有“char”枚举types

我想知道为什么我们不能有“字符”作为基础枚举types。 因为我们有byte,sbyte,int,uint,long,ulong,short,ushort作为基础枚举types。 第二什么是一个枚举的默认基础types?

默认的types是int。 MSDN上的C# 参考的更多信息。 您还可以在MSDN上find指向C#语言规范的链接。 我想这个限制的原因可能来自语言规范4.1.5节中的这些陈述。

chartypes被归类为一个整型,但是它有两种不同于其他整型的方法:

•没有从其他types到chartypes的隐式转换。 特别是,即使sbyte,byte和ushorttypes的值的范围可以使用chartypes完全表示,但是从sbyte,byte或ushort到char的隐式转换不存在。

•字符types的常量必须写成字符文字或整数文字结合使用强制types转换为char。 例如,(char)10与'\ x000A'相同。

我知道这是一个较老的问题,但这些信息对我有帮助:

它似乎没有问题使用char作为C#.NET 4.0中枚举的值types(可能甚至3.5,但我没有testing过)。 以下是我所做的,完全有效:

public enum PayCode { NotPaid = 'N', Paid = 'P' } 

将Enum转换为char:

 PayCode enumPC = PayCode.NotPaid; char charPC = (char)enumPC; // charPC == 'N' 

将char转换为Enum:

 char charPC = 'P'; if (Enum.IsDefined(typeof(PayCode), (int)charPC)) { // check if charPC is a valid value PayCode enumPC = (PayCode)charPC; // enumPC == PayCode.Paid } 

像魅力一样工作,就像您期望的字符types一样!

这是我正在使用的解决方法

 enum MyEnum { AA = 'A', BB = 'B', CC = 'C' }; static void Main(string[] args) { MyEnum e = MyEnum.AA; char value = (char)e.GetHashCode(); //value = 'A' } 

从技术上讲,你不能这样做。 但是,您可以将枚举转换为一个字节,然后将其转换为字符。 如果你的目标是有这样的事情(这实现了这是不可能的:

 public enum CharEnum { one = '1' } 

但是,您可以使用ASCII字节值然后转换:

 public enum CharEnum { one = 49, two = 50 } 

然后你可以转换为字节和char来获取char值。 这不是真的漂亮,但它会工作,如果得到一个字符是你的最终目标。 如果您需要ASCII范围之外的字符,也可以使用unicode和一个int值。 🙂

 char charPC = 'P'; if (Enum.IsDefined(typeof(PayCode), (PayCode)charPC)) { // check if charPC is a valid value PayCode enumPC = (PayCode)charPC; // enumPC == PayCode.Paid } 
  • 做了一个小小的改动,不需要把它转换成( int ),如果在所有的情况下,取决于枚举types。 但是,如果直接将其转换为枚举types本身,它应该始终工作。

几乎所有的事情都已经说过了。 只是想说你可以使用扩展,如果你使用了很多“字符枚举”:

 public enum MyEnum { MY_VALUE = 'm' } public static class MyExtensions { public static char GetChar(this Enum value) { return (char)value.GetHashCode(); } } class Program { public static void Main(string[] args) { MyEnum me = MyEnum.MY_VALUE; Console.WriteLine(me + " = " + me.GetChar()); } } 

字符枚举将简单地是string不是吗? 我不确定你会从字符枚举中得到什么其他好处?

正如其他人所说,枚举的默认types是int。