2009-03-11 17 views
7

C#で列挙型を宣言すると、デフォルトの型は自動的にintになります。C#列挙型とキャスト

それでは、なぜ、case文やその他のインスタンスでenumを使用する場合、値を使用するために明示的にリキャストする必要がありますか?あなたが明示的に訴訟を起こさなければならない場合、または私がここで何か間違っているのであれば、根底にあるタイプを持つことのポイントは何ですか?

private enum MyEnum 
     { 
      Value1, 
      Value2, 
      Value3 
     } 

    switch (somevalue) 
       { 
        case (int)MyEnum.Value1: 
         someothervar = "ss"; 
         break; 
        case (int)MyEnum.Value2: 
         someothervar = "yy"; 
         break; 
        case (int)MyEnum.Value3: 
         someothervar = "gg"; 
         break; 
       } 
+0

このコードスニペットはちょっとはっきりとしています。列挙型を定義し、入力パラメータ(somevalue)はintです。私に奇妙に見える... –

答えて

2

somevalueはタイプMyEnumである場合は、intにキャストする必要はありません。

public enum Color 
{ 
    Red, 
    Blue, 
    Green 
} 

class Program 
{ 
    static void Main(string[] args) 
    { 
     Color color = Color.Red; 

     switch (color) 
     { 
      case Color.Red: 
       break; 

      case Color.Blue: 
       break; 

      case Color.Green: 
       break; 
     } 
    } 
} 
15

somevalueのタイプは何ですか。タイプがMyEnumの場合、キャスティングは不必要でエラーなしで動作するはずです。

型がintの場合、正しく/を切り替えるにはMyEnumにキャストする必要があります。しかし、すべてのcase文ではなく値をキャストすることで、これを少し単純にすることができます。例えば、

switch((MyEnum)somevalue) { 
    case MyEnum.Value1: ... 
} 
+0

本当に-1?正当な理由がありますか? – JaredPar

+1

私はそれをdownvoteしませんでしたが、私にとって問題は、enumへのキャストが成功するという仮定です。値が有効な列挙型の値でない場合はどうなりますか?後で私の答えを見てください。 –

+2

@ウォルデン、それは質問に無関係です。問題は「なぜこれをコンパイルしないのか」です。 intから派生した列挙型にintをキャストすることは、その値が何であっても成功します。 – JaredPar

4

明示的にあなたの列挙型ではなく整数であることは明らかです。 underlying value of an enum is just the "storage type"は暗黙のうちに互換性があるわけではありません。しかし、簡単にあなたのコードをシンプルにするために、キャスト演算子を使用することができますし、「より多くの」タイプは安全:

private enum MyEnum { Value1, Value2, Value3 } 

switch ((MyEnum)somevalue) 
{ 
    case MyEnum.Value1: 
     someothervar = "ss"; 
     break; 
    case MyEnum.Value2: 
     someothervar = "yy"; 
     break; 
    case MyEnum.Value3: 
     someothervar = "gg"; 
     break; 
    default: 
     throw new NotSupportedException(); 
} 

最終的にあなたが列挙型の整数から変換する必要がありますが、頻繁になかったデザインをしたいと思いますディスクやDBからの読み込み時にはこれは当てはまりません。

1

他の人が言ったように:someValueのがタイプMyEnumである場合

  • は、あなたが キャストする必要はありません。
  • データベースまたは テキストファイルから読み取る場合は、enumの を文字列から取得するには、enumの Parseメソッドを使用します。
  • あなたは絶対に int型を比較す​​る必要がある場合、 がintに各MyEnum値をキャストするのではなく、MyEnumに にスイッチをキャストする方が効率的です。