2016-01-31 11 views
7

C#.NET 4.5、Windowsの10、I以下の列挙型があります。C#Enum.TryParseは無効な数の文字列を解析し

private enum Enums 
{ 
    A=1, B=2, C=3 
} 

を、このプログラムは非常に奇妙な方法で動作します。

public static void Main() 
{ 
    Enums e; 
    if (Enum.TryParse("12", out e)) 
    { 
     Console.WriteLine("Parsed {0}", e); 
    } 
    else 
    { 
     Console.Write("Not parsed"); 
    } 
    Console.ReadLine(); 
} 

I TryParseメソッドの結果は偽であると予想しますが、驚いたことに コンソールには "Parsed 12"と表示されます。 ウォッチウィンドウでは、値が "12"でEnumsタイプであることも表示されます。

これは試した番号の文字列(「540」など)には該当しますが、文字列(「A12」、「12A」)には該当しません。

数字だけの文字列かどうかを最初に確認することで、これを簡単に解決できますが、なぜこれが動作ですか? これは仕様ですか?

ありがとうございます! イド

+1

はい、仕様です。値の '.ToString()'が特定の文字列を返すことができ、問題の型が '.Parse()'メソッドを持っている場合、parseメソッドはその文字列を受け入れるべきです。 enumは "未知"の値(つまりenumに名前を持たない値)を保持することができ、 '.ToString()'は文字列中の数値としてこれらを返します。 '.Parse() 'は整数だけを保持する文字列を受け付けるべきです。はい、これは設計によるものです。あなたはこの決定に同意しないかもしれませんが、それはそれです。 –

答えて

6

TryParseは、渡される整数に対して真戻っている理由が考えられますので、内部的には、列挙型は整数として保存されている。

を任意の整数が働いている理由について、それはデザインによってです。 MSDN(強調鉱山)から:

この方法戻り、結果は値解析操作が成功した場合の値で表されるタイプTEnum のオブジェクトを含みます。 解析操作が失敗した場合、結果には のTEnum型のデフォルト値が含まれます。 この値は、 TEnum列挙のメンバーである必要はありません。このパラメータは初期化されずに渡されます。

+3

ありがとう! また、明らかにMSDNから: この動作が望ましくない場合は、IsDefinedメソッドを呼び出して、整数の特定の文字列表現が実際にTEnumのメンバーであることを確認してください。 –

+0

ようこそ。はい、 'IsDefined'を使用すると、メンバー以外の整数が渡される可能性がある場合に役立ちます。デフォルトの 'TryParse'の代わりにそのメソッドを使うことができるように、解析の後に' IsDefined'チェックを処理する拡張メソッドを作成することができます。 – keyboardP

2

列挙型の変数またはフィールドは、基礎となるタイプの任意の値を保持することができるので、あなたの場合にタイプEnumsの変数12の値を記憶することは、完全に合法である:したがって

var e = (Enums) 12; 
var i = (int) e; // i is 12 

Enum.TryParseはタイプint(または列挙で使用された基本整数型)の任意の値を解析できなければなりません。

列挙に表現がない値を拒否する場合は、Enum.IsDefinedでそれらを確認してください。

関連する問題