2010-11-19 3 views
14

誰でも私に私の列挙型からIntにキャストする必要がある理由を教えてもらえますか?c#:なぜ、キャストは、EnumからINTにswitch文で使用する必要がありますか?、enumsはintです

  switch (Convert.ToInt32(uxView.SelectedValue)) 
     { 
      case (int)ViewBy.Client: 

キャストを取り除くと失敗し、キャストを使用する必要があると言います。

これは私のenumです。enumはintsです...これについて誰かが知っていますか?

 public enum ViewBy 
    { 
     Client, 
     Customer 
    } 

答えて

9

C#enumでは、数字は単なる数字ではありません。むしろ、それらは、コンテキスト内で名前を持つ型または番号に関連付けられた数字です。

case文でキャストを避けるために、あなたはswitchでキャストを行うことができます。

switch((ViewBy)Convert.ToInt32(uxView.SelectedValue)) 

これは、しかし、独自の問題を抱えています。たとえば、このコードは7をコンソールに書き出します。

enum ViewBy 
{ 
    ChuckNorris = 1, 
    JamesBond 
} 

Console.WriteLine((ViewBy)7); 
+0

素晴らしい..ありがとう..それは働いた! – Martin

+4

それは何の問題だろうか?!?!? Do tell –

+1

@ jordan.peoplesもし興味があれば私の更新を見てください。遅くなったほうがいい、ハァッ:) –

4

Enum.Parseを使用して文字列値を列挙型に変換する必要があります。

ViewBy selected = (ViewBy) Enum.Parse(typeof(ViewBy), uxView.SelectedValue);   
switch (selected) 
{ 
    case ViewBy.Client: 
    // etc. 
} 

また、列挙型の基になる型は、必ずしもInt32である必要はありません。

2

Enumsませints .NETの型システムでです!
フレームワークは、離散的な整数値の助けを借りて、それらを保存する - それは別のことだ...

をトーマス

2

MSDNから:

switch (expression) 
     case constant-expression : statement 
    [default : statement] 

それぞれの場合の定数式を ラベルはタイプ の式に変換され、等価の式 と比較されます。コントロール は、ケース の定数式が式の値 と一致するステートメントに渡されます。

enumからintへの暗黙的な変換はありません。したがって、caseには明示的な変換が必要です。ただし、最初に正しいタイプの式をオンに切り替えると、すべてのケースをキャストするよりも意味があります(Enum.Parse参照)。

0

私はそのような場合には、種類の違うように見えますが、intとallの変換を持つとします。あなたが心に留めておく、そのメソッドに、列挙型をint型に合格し、ないのだとすると

  1. あなたはいつでも解除は、将来あなたがなるように、その十分文書化しようとしていますシステムを修正または強化することができますか?
  2. この列挙型は他の場所で使用されていませんか?(同じ情報を扱う方法のパターンは、後輩を間違えたり失ったりしないための鍵です。)

答えが両方ともいいえでない場合は、近い将来あなた自身の正気の

btwは、intに変換して別のintと比較するのが簡単です(例では文字列ではありません)。質問「私は私の列挙型からint型にキャストする必要があり、なぜ誰も私を伝えることができる」ことに応答して

0

....

列挙型の値が整数ではありませんので、あなたが整数にキャストする必要があります。列挙型には、整数型として格納できる基になる値があります(デフォルトはint)。

あなたは

Enum.GetUnderlyingType(typeof(ViewBy)); 

との基になる型を決定することができますが、すべてでintにキャストが必要になりますなぜあなたは、より詳細herehere

0

を見つけることができますか? uxView.SelectedValueがViewBy列挙型の場合、単純に(ViewBy)uxView.SelectedValueで十分でしょうか?

+0

'SelectedValue'は' string'です –

関連する問題