web-dev-qa-db-ja.com

Enum.TryParseは、すべての数値に対してtrueを返します

Enum.TryParseを使用しているときに予期していなかった動作が発生しています。

列挙型がある場合:

public enum MyEnum
{
  ValueA,
  ValueB,
  ValueC
}

次に、次のように数値を(文字列として)Enum.TryParseに渡します。

MyEnum outputEnum;
bool result = Enum.TryParse("1234", out outputEnum);

文字列「1234」が可能な値ではないにもかかわらず、結果はtrueとして返され、outputEnumの値は1234になります。

この種の動作を回避する方法はありますか?任意の文字列入力を列挙型として処理する関数を作成しようとしていますが、これにより、入力不良の検出で少しモンキーレンチがスローされました。

53
mweber

この動作は仕様によるものです。

ドキュメント は言う:

。 valueがTEnum列挙の基になる値を表さない整数の文字列表現である場合、メソッドは、基になる値が整数型に変換された値である列挙メンバーを返します。この動作が望ましくない場合は、IsDefinedメソッドを呼び出して、整数の特定の文字列表現が実際にTEnumのメンバーであることを確認します。

Enum.IsDefinedを呼び出して、解析した値がこの特定のenumに実際に存在することを確認します。

[Flags]列挙型(ビットマスク)を扱っている場合、それはより複雑になります。

73
SLaks