С# 7.3 Enum constraint: Почему я не могу использовать перечисление с нулевым значением?

Теперь, когда у нас есть ограничение перечисления, почему компилятор не позволяет мне написать этот код?

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" должен быть невообразимым типом значения, чтобы использовать его как параметр "T" в родовом типе или методе "Nullable"

Ответы

Ответ 1

Вы можете, но вам нужно добавить еще одно ограничение: ограничение struct.

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

Ответ 2

Поскольку System.Enum является классом, вы не можете объявить переменную типа Nullable<Enum> (поскольку Nullable<T> возможен только в том случае, если T является struct).

Таким образом:

Enum? bob = null;

не будет компилироваться, и ваш код тоже не будет.

Это определенно странно (поскольку Enum сам по себе является классом, но определенный Enum который вы определяете в своем коде, является struct), если вы раньше не сталкивались с ним, но это явно class (а не struct) в соответствии с docs и исходный код.