Ссылочные типы, допускающие значение NULL: как указать «T?» тип без ограничений класса или структурыC#

Место общения программистов C#
Ответить Пред. темаСлед. тема
Anonymous
 Ссылочные типы, допускающие значение NULL: как указать «T?» тип без ограничений класса или структуры

Сообщение Anonymous »

Я хочу создать универсальный класс, имеющий член типа T. T может быть классом, классом, допускающим значение NULL, структурой или структурой, допускающей значение NULL. Так что в принципе что угодно. Это упрощенный пример, показывающий мою проблему:

#nullable enable

class Box {
public T Value { get; }

public Box(T value) {
Value = value;
}

public static Box CreateDefault()
=> new Box(default(T));
}


Из-за использования новой функции #nullable Enable я получаю следующее предупреждение: Program.cs(11,23): предупреждение CS8653: выражение по умолчанию вводит нулевое значение, когда «T» является ссылочным типом, не допускающим значения NULL.

Для меня это предупреждение имеет смысл. Затем я попытался исправить это, добавив ? к параметру свойства и конструктора:

#nullable enable

class Box {
public T? Value { get; }

public Box(T? value) {
Value = value;
}

public static Box CreateDefault()
=> new Box(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 классом или struct.

Очевидное решение — поместить нарушающие элементы в директиву #nullabledisable. Однако, как и в случае с отключением предупреждения #pragma, я бы не хотел этого делать, если в этом нет необходимости. Есть ли другой способ скомпилировать мой код, не отключая проверки на отсутствие значений или предупреждение CS8653?

$ dotnet --info
.NET Core SDK (reflecting any global.json):
Version: 3.0.100-preview4-011223
Commit: 118dd862c8


Подробнее здесь: https://stackoverflow.com/questions/559 ... g-to-class
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «C#»