15

文字列を列挙値に変換することについては、ここで多くの質問があります。一般的に、答えはこの質問の答えのように見えます:

StatusEnum MyStatus = (StatusEnum) Enum.Parse( typeof(StatusEnum), "Active", true );

これは完全に合理的な答えであり、呼び出しを単純化するメソッドを作成できますが、適切な列挙値の代わりにEnum.Parse()が返される理由の質問には答えません。objectなぜキャストする必要があるのStatusEnumですか?


編集:

基本的に、問題は、なぜこのような関数がEnumクラスの一部ではないのかということです。

    public static T Parse<T>(string value) where T: struct 
    {
        return (T)Enum.Parse(typeof (T), value);
    }

この関数は完全に正常に機能し、期待どおりに機能します。 StatusEnum e = Enum.Parse<StatusEnum>("Active");

4

5 に答える 5

12

これを行うのは

  1. それはジェネリックスよりも前のものであり、(そうでなかったとしても:)
  2. ジェネリック制約を列挙型にすることはできません(主流の.NET言語)

そのため、Objectはどのタイプでも常に機能する唯一のタイプですenum

オブジェクトを返すことにより、キャストが必要な場合でも、APIは少なくとも機能します。

于 2012-09-07T20:25:25.527 に答える
4

ただし、TryParse は型パラメーターをサポートしています。

Enum.TryParse<FooEnum>(name, true, out ret);

したがって、out 値 ret を として指定すると、後でFooEnum ret;a にキャストする必要がなくなります。FooEnumすぐに適切なタイプになります。

于 2012-09-07T21:09:17.597 に答える
3

オブジェクトの実際のタイプは確かにStatusEnumです。コンパイラとコードは、記述Enum.Parse時に、メソッドが記述された時点でそのランタイムオブジェクトが何であるかを認識していません。メソッドが実際に呼び出されるまではわかりません。

于 2012-09-07T20:25:37.417 に答える