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

时间:2009-02-21 13:13:58

标签: c# enums char

我想知道为什么我们不能将“char”作为底层枚举类型。 因为我们有byte,sbyte,int,uint,long,ulong,short,ushort作为底层 枚举类型。 二,枚举的默认底层类型是什么?

9 个答案:

答案 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
}
  • 做了一个小改动,无需将其转换为( int )if if for all case,取决于枚举类型。但是如果你将它直接转换为枚举类型本身,它应该总能工作。

答案 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。