66

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

列挙型がある場合:

public enum MyEnum
{
  ValueA,
  ValueB,
  ValueC
}

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

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

文字列「1234」は可能な値ではありませんが、結果はtrueに戻り、outputEnumの値は1234になります。

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

4

3 に答える 3

87

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

ドキュメントには次のように書かれています。

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

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

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

于 2011-07-19T02:29:37.253 に答える
0

数値が完全に受け入れられるのを避けたい場合Enum.IsDefined()は、条件にチェックを追加して、文字列が数値ではないことを確認できます。さまざまなトレードオフでそれを行うにはさまざまな方法がありますが、たとえば、次のようにすることができます。

string valueToParse = "1234";
bool result = !valueToParse.All(char.IsDigit) && Enum.TryParse(valueToParse, out MyEnum outputEnum);
于 2021-11-09T11:27:34.850 に答える