Ответ 1
Вы можете, но вам нужно добавить еще одно ограничение: ограничение struct
.
public static void DoSomething<T>(T? defaultValue) where T : struct, Enum
{
}
Теперь, когда у нас есть ограничение перечисления, почему компилятор не позволяет мне написать этот код?
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"
Вы можете, но вам нужно добавить еще одно ограничение: ограничение struct
.
public static void DoSomething<T>(T? defaultValue) where T : struct, Enum
{
}
Поскольку System.Enum
является классом, вы не можете объявить переменную типа Nullable<Enum>
(поскольку Nullable<T>
возможен только в том случае, если T
является struct
).
Таким образом:
Enum? bob = null;
не будет компилироваться, и ваш код тоже не будет.
Это определенно странно (поскольку Enum
сам по себе является классом, но определенный Enum
который вы определяете в своем коде, является struct
), если вы раньше не сталкивались с ним, но это явно class
(а не struct
) в соответствии с docs и исходный код.