web-dev-qa-db-ja.com

C#7.3列挙型制約:なぜnull可能列挙型を使用できないのですか?

列挙型の制約があるのに、なぜコンパイラでこのコードを記述できないのですか?

public static TResult? ToEnum<TResult>(this String value, TResult? defaultValue)
    where TResult : Enum
{
    return String.IsNullOrEmpty(value) ? defaultValue : (TResult?)Enum.Parse(typeof(TResult), value);
}

コンパイラは言う:

エラーCS0453型 'TResult'は、ジェネリック型またはメソッド 'Nullable'のパラメーター 'T'として使用するために、nullを許可しない値型である必要があります

37

可能ですが、別の制約を追加する必要があります:struct制約。

public static void DoSomething<T>(T? defaultValue) where T : struct, Enum
{
}
49
Patrick Hofman

System.Enumはクラスであるため、Nullable<Enum>型の変数を宣言することはできません(Nullable<T>Tstructである場合にのみ可能であるため)。

副<文>この[前述の事実の]結果として、それ故に、従って、だから◆【同】consequently; therefore <文>このような方法で、このようにして、こんなふうに、上に述べたように◆【同】in this manner <文>そのような程度まで<文> AひいてはB◆【用法】A and thus B <文>例えば◆【同】for example; as an example:

Enum? bob = null;

コンパイルされず、コードもコンパイルされません。

これは間違いなく奇妙です(Enum自体はクラスですが、コードで定義する特定のEnumstructです)。 、ただし、 docs およびソースコードによると、明らかにclassstructではありません)です。

16
mjwills