C # 7.3 Ограничение Enum: Почему я не могу использовать nullable enum? - PullRequest
0 голосов
/ 15 мая 2018

Теперь, когда у нас есть ограничение 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 '

Ответы [ 2 ]

0 голосов
/ 15 мая 2018

Можно, но нужно добавить другое ограничение: ограничение struct.

public static void DoSomething<T>(T? defaultValue) where T : struct, Enum
{
}
0 голосов
/ 15 мая 2018

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

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

Enum? bob = null;

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

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

...