基になる列挙型として「char」を使用できない理由を知りたいです。基になる列挙型として byte、sbyte、int、uint、long、ulong、short、ushort があるためです。次に、列挙型のデフォルトの基になる型は何ですか?
9 に答える
これは古い質問であることは知っていますが、この情報は役に立ちました:
C# .NET 4.0 (おそらく 3.5 でも可能ですが、私はこれをテストしていません) の列挙型の値の型として char を使用しても問題はないようです。これが私がやったことです、そしてそれは完全に機能します:
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 型から期待されるのと同じように、魅力的に機能します!
デフォルトの型は int です。詳細については、MSDNの C#リファレンスを参照してください。MSDN でC# 言語仕様へのリンクを見つけることもできます。制限の理由は、おそらく言語仕様のセクション 4.1.5 のこれらのステートメントに由来すると思います。
char 型は整数型として分類されますが、次の 2 つの点で他の整数型とは異なります。
• 他の型から char 型への暗黙的な変換はありません。特に、sbyte、byte、および ushort 型には char 型を使用して完全に表現できる値の範囲がありますが、sbyte、byte、または ushort から char への暗黙的な変換は存在しません。
• char 型の定数は、char 型へのキャストと組み合わせて、文字リテラルまたは整数リテラルとして記述する必要があります。たとえば、(char)10 は「\x000A」と同じです。
これは私が使用している回避策です
enum MyEnum
{
AA = 'A',
BB = 'B',
CC = 'C'
};
static void Main(string[] args)
{
MyEnum e = MyEnum.AA;
char value = (char)e.GetHashCode(); //value = 'A'
}
技術的には、これを行うことはできません。ただし、列挙型を1バイトに変換してから、それをcharに変換することはできます。これは、あなたの目標がこのようなものを持つことである場合に役立ちます(これを実現することは不可能です:
public enum CharEnum
{
one = '1'
}
ただし、ASCIIバイト値を使用してから変換することにより、これを行うことができます。
public enum CharEnum
{
one = 49,
two = 50
}
次に、byteおよびcharに変換して、char値を取得できます。それは本当にきれいではありませんが、charを取得することがあなたの究極の目標である場合、それは機能します。ASCII範囲外の文字が必要な場合は、unicodeとint値を使用することもできます。:-)
それについては、ほとんどすべてがすでに述べられています。多くの「char enum」を使用する場合は、拡張機能を使用できると言いたかっただけです。
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());
}
}
文字列挙型は単に文字列になりますね。文字の列挙から他にどのようなメリットが得られるかわかりませんか?
他の人が言っているように、デフォルトの型は列挙型のintです。