2011-02-09 24 views
8

私は現在、先進的なプログラマが良いリファレンスとして使用するためにも優れた本だと思うように、C# 4.0 in a Nutshellという本を読んでいます。Enum.Isフラグ付き列挙型で定義されています

私は基本についての章を振り返り、フラグ付き列挙型を使用しているときに特定の値が列挙型で定義されているかどうかを知るためにトリックを見つけました。
本はEnum.IsDefinedを使用すると、フラグ付き列挙型では動作しないと述べており、このように回避策を示している:一定の値にフラグが設定された列挙型で定義されている場合、これはtrueを返す

static bool IsFlagDefined(Enum e) 
{ 
    decimal d; 
    return (!decimal.TryParse(e.ToString(), out d); 
} 

誰かが私にこの理由が説明できますか?一方

SomeValue, SomeOtherValue 

:事前に

感謝:)

+0

を別として、Enum.IsDefinedが期待と異なる動作をする可能性があります(またはデフォルト(T)かもしれません)。 Enum.IsDefined(default(T))はtrueと_false_の両方を返すことができます。デフォルト(T)(Tは列挙型)は常に(T)0を返します。したがって、Tが(T)0に対して有効な値を持たない場合、結果は偽です。少なくとも1回は私を捨ててください –

答えて

12

は基本的には、[Flags]属性で宣言された型のいずれかのenum値にToStringを呼び出すと、任意の定義された値のために、このようなものを返します。値がでない場合、enumタイプ内で定義されたである場合、ToStringは、その値の文字列表現を単に生成します。の整数値、例えば:

5 

だから、これはあなたが(著者はdecimalを選んだ理由がわからない)数としてToStringの出力を解析することができれば、それはタイプ内で定義されていないということです何を意味するのか。ここで

はイラストです:

[Flags] 
enum SomeEnum 
{ 
    SomeValue = 1, 
    SomeOtherValue = 2, 
    SomeFinalValue = 4 
} 

public class Program 
{ 
    public static void Main() 
    { 
     // This is defined. 
     SomeEnum x = SomeEnum.SomeOtherValue | SomeEnum.SomeFinalValue; 

     Console.WriteLine(x); 

     // This is not (no bitwise combination of 1, 2, and 4 will produce 8). 
     x = (SomeEnum)8; 

     Console.WriteLine(x); 
    } 
} 

上記のプログラムの出力は次のとおりです。

 
SomeOtherValue, SomeFinalValue 
8 

ですから、提案された方法がどのように動作するかを確認することができます。

+0

SomeEnum.SomeValue = 0にする必要がありますか? – PaulB

+0

@PaulB:可能です。あなたは通常、0のための 'None'値があるので尋ねていますか?それは本当であり、恐らくそれほど混乱しません。たぶん私は誰も捨てないように答えを更新するだろう。 –

+0

はい、ちょうどあなたはSomeValueを他のものと一緒に表現することができませんでした...変更をありがとう:) – PaulB

0

フラグの組み合わせを使用してeの値を作成できない場合、ToString()はデフォルトで整数になります。整数はもちろん、decimalと解釈されます。

しかし、なぜあなたのコードは10進数として解析されるのかは私にはっきりと分かりません。しかし、Int64UInt64をベースとしたenumの両方について、おそらく整数型は機能しません。

関連する問題