Рассмотрим следующий код, скомпилированный в контексте #nullable
и использующий . Net Framework 4.8 :
public sealed class Test<T>
{
public Test()
{
_data.Add(default); // warning CS8604: Possible null reference argument for parameter 'item' in 'void List<T>.Add(T item)'.
}
public T Item => _data[0];
readonly List<T> _data = new List<T>();
}
Этот код вызывает предупреждение CS8604, как указано в комментарии.
Это не возможно исправить код, используя T?
без ограничения T
как class
:
public sealed class Test<T>
{
public Test()
{
_data.Add(default);
}
public T? Item => _data[0]; // error CS8627: A nullable type parameter must be known to be a value type or non-nullable reference type
readonly List<T?> _data = new List<T?>(); // error CS8627: A nullable type parameter must be known to be a value type or non-nullable reference type
}
Я не могу добавить " Ограничение типа struct "или" class ", потому что этот код на самом деле находится в классе PriorityQueue<T>
, который уже используется во многих местах как со значениями, так и со ссылочными типами.
Итак, на данный момент я сделал просто подавите сообщение следующим образом:
public Test()
{
_data.Add(default!); // Note the "!"
}
Это правильный способ справиться с этим (учитывая, что это должно работать с. Net Framework 4.8, поэтому новые аннотации кода, связанные с нулем, недоступны )?