Как правильно работать с "Список <T>. Добавить (по умолчанию)"? - PullRequest
2 голосов
/ 16 июня 2020

Рассмотрим следующий код, скомпилированный в контексте #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, поэтому новые аннотации кода, связанные с нулем, недоступны )?

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