Я хочу создать универсальный класс, который имеет член типа T
.T
может быть классом, обнуляемым классом, структурой или обнуляемой структурой.Так что в принципе все что угодно.Это упрощенный пример, который показывает мою проблему:
#nullable enable
class Box<T> {
public T Value { get; }
public Box(T value) {
Value = value;
}
public static Box<T> CreateDefault()
=> new Box<T>(default(T));
}
Из-за использования новой функции #nullable enable
я получаю следующее предупреждение: Program.cs(11,23): warning CS8653: A default expression introduces a null value when 'T' is a non-nullable reference type.
Это предупреждение имеет смысл для меня.Затем я попытался исправить это, добавив ?
к параметру свойства и конструктора:
#nullable enable
class Box<T> {
public T? Value { get; }
public Box(T? value) {
Value = value;
}
public static Box<T> CreateDefault()
=> new Box<T>(default(T));
}
Но теперь вместо этого я получаю две ошибки:
Program.cs(4,12): error CS8627: A nullable type parameter must be known to be a value type or non-nullable reference type. Consider adding a 'class', 'struct', or type constraint.
Program.cs(6,16): error CS8627: A nullable type parameter must be known to be a value type or non-nullable reference type. Consider adding a 'class', 'struct', or type constraint.
Однако,Я не хочу добавлять ограничение. Мне все равно, является ли T
классом или структурой.
Очевидное решение - заключить нарушающие члены в директиву #nullable disable
.,Однако, как и #pragma warning disable
, я бы хотел избежать этого, если в этом нет необходимости.Есть ли другой способ заставить мой код компилироваться, не отключая проверки обнуляемости или предупреждение CS8653?
$ dotnet --info
.NET Core SDK (reflecting any global.json):
Version: 3.0.100-preview4-011223
Commit: 118dd862c8