2017-12-31 33 views
8

Enum.IsDefined()メソッドを文字列に使用しましたが、Trueを取得する必要がある状況でFalseを取得します。Enum.IsDefinedは文字列に対してfalseを返します

public enum YourEnum : int 
{ 
    Zero = 0, 
    One = 1 
} 

public class Program 
{ 

    public static void Main(string[] args) 
    { 
     Console.WriteLine(Enum.IsDefined(typeof(YourEnum), 1)); 
     Console.WriteLine(Enum.IsDefined(typeof(YourEnum), 1.ToString())); 
    } 
} 

C# Fiddle Demo
結果:

True 
False 

私は後者の場合にはFalseを取得する必要がありますなぜ私にはわからない以下のコードをご確認ください。どんな助けもありがとうございます。

+1

これは 'string'を受け入れる' Enum.Parse() 'です。 'Enum.IsDefined()'はあなたの 'enum'で定義されている定数*を渡しているものと比較します。 – haim770

+0

私の主な質問にはあまり関係ない答えは「Enum.IsDefined」です。 'object'を2番目のパラメータとして使用すると、' IsDefined'を実行しても、2番目のパラメータの型もチェックする必要がありますか? –

答えて

19

IsDefined()メソッドに文字列を渡すと、その名前がのの値があるかどうかを確認しています。 The documentationは読む:
型enumTypeの任意のメンバー•:

値パラメータは、次のいずれかとすることができます。
•値がenumType型の列挙型メンバーである変数。
列挙型メンバの名前の文字列表現。文字列内の文字は、列挙メンバー名と同じ大文字と小文字を持つ必要があります。
•enumTypeの基になる型の値。

(強調鉱山)

同じのすべての結果、上記第1、第2、及び第四のオプションので、それは、読み少し混乱だ:列挙型の値が渡される(箱入り、のコース)。

しかし、3つ目のオプションはシナリオで起こっていることで、文字列はという名前のenumメンバーの名前と一致する必要があります。文字列"1"を渡しており、列挙型の有効な名前は"Zero""One"です。文字列"1"がこれらのいずれとも一致しないため、IsDefined()falseを返します。

5

文字列を引数として渡すと、列挙型の名前の1つが指定された文字列と等しいかどうかが調べられます。以下の両方に該当する場合は、両方ともtrueを返します。

Console.WriteLine(Enum.IsDefined(typeof(YourEnum), 1)); 
Console.WriteLine(Enum.IsDefined(typeof(YourEnum), "Zero")); 

source code (line 1503)を参照してください。それを言っておけば、@Peter Dunihoの答えは実装が変更される可能性があるので、ドキュメントからこの情報を推測する方が良いですが、興味があればソースコードもあります。

関連する問題