Проблема в том, что кто-то может сделать:
var list = new MyList<string>();
string d = list.GetDefault();
Так как они создали MyList<string>
, то T
равно string
(то есть строка без значения NULL). Поэтому, поскольку GetDefault()
возвращает T
, это должно означать, что он возвращает ненулевую строку.
Однако, если они вызывают GetDefault()
, это вернет default(string)
, то есть null
. Они получат null
, когда не ожидали его!
Вы не можете помешать кому-либо создать MyList<string>
: нет синтаксиса, чтобы сказать "T
must только может иметь тип NULL и не должен иметь тип NULL.
Если вы ограничите T
значением struct
или class
, вы можете написать:
class MyList<T> : IMyEnumberable<T> where T : struct // or : class
{
public T? GetDefault()
{
return default;
}
}
В качестве альтернативы, вы можете добавить [MaybeNull]
к типу возвращаемого значения GetDefault()
, чтобы сказать, что, даже если он возвращает T
(и T
может не иметь значения NULL), этот метод может на самом деле return null
.
(Обратите внимание, что в настоящее время это влияет только на абонентов из GetDefault()
, а не на фактическое тело, поэтому вам все равно понадобится оператор подавления нулей !
Похоже, это скоро изменится):
using System.Diagnostics.CodeAnalysis;
class MyList<T> : IMyEnumberable<T>
{
[return: MaybeNull]
public T GetDefault()
{
return default!;
}
}
SharpLab .