42

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

4

9 回答 9

82

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

在 C# .NET 4.0(甚至可能是 3.5,但我还没有测试过)中,使用 char 作为枚举的值类型似乎没有问题。这是我所做的,它完全有效:

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

将枚举转换为字符:

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

将 char 转换为枚举:

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 类型所期望的那样,就像一个魅力一样!

于 2012-04-18T05:42:51.373 回答
15

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

char 类型被归类为整数类型,但它与其他整数类型有两个不同之处:

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

• char 类型的常量必须写为字符文字或整数文字与转换为char 类型的组合。例如,(char)10 与 '\x000A' 相同。

于 2009-02-21T13:19:17.537 回答
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'
}
于 2010-05-10T09:42:06.170 回答
3

从技术上讲,你不能这样做。但是,您可以将枚举转换为字节,然后将其转换为字符。如果您的目标是拥有这样的东西,这很有用(意识到这是不可能的:

public enum CharEnum
{
    one = '1'
}

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

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

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

于 2009-02-21T14:21:26.857 回答
1

请参阅Ecma International中的 ECMA 标准 335,通用语言基础结构 (CLI) 。CLI 允许底层类型为 char 或 bool,但 C# 和 VB.Net 不允许。对于它的价值,C++/CLI 确实允许 System::Char 作为底层类型。

我认为 C# 和 VB.Net 仅出于语法原因不允许 char 和 bool 作为基础类型。

于 2018-05-12T15:57:44.850 回答
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
}
  • 做了一个小改动,在所有情况下都不需要在 if 中将其转换为(int),这取决于枚举类型。但是如果你直接将它转换为枚举类型本身,它应该总是有效的。
于 2017-09-25T16:59:53.643 回答
0

针对 VB.NET 和 CLI 消费者,您可以像这样编译 char 枚举(最容易使用启用了 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

}
于 2019-11-10T17:48:56.403 回答
-1

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

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());
    }
}
于 2012-10-26T22:48:43.893 回答
-5

字符枚举只是字符串,不是吗?我不确定您会从字符枚举中获得什么其他好处?

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

于 2009-02-21T13:39:25.117 回答