Я хочу создать универсальный класс, который имеет член типа 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