我想知道为什么我们不能将“char”作为底层枚举类型。 因为我们有byte,sbyte,int,uint,long,ulong,short,ushort作为底层 枚举类型。 二,枚举的默认底层类型是什么?
答案 0 :(得分:76)
我知道这是一个较旧的问题,但这些信息对我有帮助:
在C#.NET 4.0中使用char作为枚举的值类型似乎没有问题(可能甚至是3.5,但我没有对此进行测试)。这就是我所做的,它完全有效:
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
}
像魅力一样工作,就像你对char类型所期望的那样!
答案 1 :(得分:15)
默认类型为int。有关MSDN的C#reference的更多信息。您还可以在MSDN上找到指向C# language specification的链接。我认为限制的原因可能源于语言规范第4.1.5节中的这些陈述。
char类型被归类为 积分型,但它不同于 其他整数类型有两种方式:
•没有隐式转换 从其他类型到char类型。在 特别是,即使是sbyte, byte和ushort类型的范围是 完全可表示的值 使用char类型,隐式 来自sbyte,byte或的转换 ushort to char不存在。
•char类型的常量必须是 写作字符文字或作为 整数文字与a结合使用 强制转换为char类型。例如, (char)10与'\ x000A'相同。
答案 2 :(得分:13)
这是我正在使用的解决方法
enum MyEnum
{
AA = 'A',
BB = 'B',
CC = 'C'
};
static void Main(string[] args)
{
MyEnum e = MyEnum.AA;
char value = (char)e.GetHashCode(); //value = 'A'
}
答案 3 :(得分:3)
从技术上讲,你不能这样做。但是,您可以将枚举转换为字节,然后将其转换为char。如果你的目标是拥有这样的东西,那么这很有用(意识到这是不可能的:
public enum CharEnum
{
one = '1'
}
但是,您可以使用ASCII字节值然后转换:
public enum CharEnum
{
one = 49,
two = 50
}
然后,您可以转换为byte和char以获取char值。它不是很漂亮,但它会起作用,如果获得一个char是你的最终目标。如果需要在ASCII范围之外的字符,还可以使用unicode和int值。 : - )
答案 4 :(得分:1)
请参阅Ecma International中的ECMA标准335,公共语言基础结构(CLI)。 CLI允许底层类型为char或bool,但C#和VB.Net不允许它。对于它的价值,C ++ / CLI确实允许System :: Char作为基础类型。
我认为C#和VB.Net不允许使用char和bool作为基础类型,只是出于语法原因。
答案 5 :(得分:0)
char charPC = 'P';
if (Enum.IsDefined(typeof(PayCode), (PayCode)charPC)) {
// check if charPC is a valid value
PayCode enumPC = (PayCode)charPC; // enumPC == PayCode.Paid
}
答案 6 :(得分:0)
针对VB.NET和CLI使用者,您可以像这样编译字符枚举(最简单的做法是启用IL支持(扩展)的VB.NET或C#项目):
.class public auto ansi sealed Hafner.Testing.EdgeCase.CharEnum
extends [mscorlib]System.Enum
{
.field public specialname rtspecialname char value__
.field public static literal valuetype Hafner.Testing.EdgeCase.CharEnum Min = char(0)
.field public static literal valuetype Hafner.Testing.EdgeCase.CharEnum Zero = char(0)
.field public static literal valuetype Hafner.Testing.EdgeCase.CharEnum Max = char(65535)
.field public static literal valuetype Hafner.Testing.EdgeCase.CharEnum DuplicateSameValue = char(65) //A
.field public static literal valuetype Hafner.Testing.EdgeCase.CharEnum duplicateSameValue = char(65) //A
.field public static literal valuetype Hafner.Testing.EdgeCase.CharEnum DuplicateOtherValue = char(90) //Z
.field public static literal valuetype Hafner.Testing.EdgeCase.CharEnum duplicateOtherValue = char(88) //X
}
答案 7 :(得分:-1)
几乎所有人都已经说过了。只是想说如果使用大量“char enums”,你可以使用扩展名:
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());
}
}
答案 8 :(得分:-4)
字符枚举只是字符串不是吗?我不确定你会从字符枚举中获得什么其他好处?
正如其他人所说,默认类型是枚举的int。