Что значит класс? (класс с вопросительным знаком) означает ограничение типа C# generi c? - PullRequest
1 голос
/ 07 января 2020

Пока я пытался найти ответ на другой вопрос, я заметил, что этот код компилируется в C#:

public void Foo<T>(T obj)
    where T : class?
{
}

Мне не удалось найти в документации, что он вообще означает.

Ответы [ 2 ]

6 голосов
/ 07 января 2020

Это означает, что T должен быть обнуляемым ссылочным типом.

Тип, который вы устанавливаете для T, должен быть производным от object?.

Это новая функция в C # 8 , чтобы явно объявить тип как обнуляемый. если у вас есть

 Add<T>(T tmp);

ваш документ, то можно добавить ноль;

1 голос
/ 07 января 2020

Чтобы ваш класс возвращал null значение без предупреждения CS864, вы можете немного переписать свой код

public T? Foo<T>(T obj)
    where T : class
{
    return null;
}

Вопрос о class? является открытым вопросом GitHub прямо сейчас, посмотрите здесь . Ограничение class? еще не реализовано, и поэтому компилятор угрожает ему, как обычный class, и пока генерирует A null literal introduces a null value when 'T' is a non-nullable reference type.

Вы также можете обратиться к разделу The issue wit T? в этой статье чтобы увидеть некоторые детали. Пример кода выше - рекомендуемый способ работы с обнуляемым generi c type

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...