Представьте, что вы звоните:
string result = Foo<string>();
result
теперь содержит null
. Но это string
, который не может быть обнуляем.
Компилятор предупреждает вас, что Foo<T>
может быть вызвано, когда T
не обнуляется, и возвращение null
в этом случае будет неожиданным.
Обратите внимание, что where T : class?
означает, что T
может быть обнуляемым, но также может и не быть. И string
, и string?
разрешены. Я не верю, что есть какой-либо способ сказать «T
должен быть обнуляемым».
Если вы пытаетесь сказать:
T
допускается обнулять - Когда
T
не может обнуляться, этот тип все еще может возвращать null
Тогда вы можете написать:
[return: MaybeNull]
public T Foo<T>()
where T : class?
{
return null!;
}
SharpLab
Обратите внимание, что MaybeNull
применяется только к контракту метода, а не к его телу, поэтому нам нужно вернуть null!
. Однако в приведенной выше ссылке SharpLab видно, что вызывающий абонент string result = Foo<string>();
получает правильное предупреждение.