Как конвертировать IList в IList <T>в C# 8 обнуляемый ссылочный тип - PullRequest
0 голосов
/ 27 января 2020

Описание проблемы

Я работаю с C# 8 и ссылочными типами Nullable.

Я получаю предупреждения с помощью такого метода:

private IList<Person?> persons;

// some initialisations here....

IList<Person> GetPersons()
{
   return someList.Where(t => t != null).ToList();
}

Предупреждение:

[CS8619] Nullability of reference types in value of type 
'IList<Person?>' doesn't match target type 'IList<Person>'.

Я также попробовал следующее:

return someList.Where(t => t != null).Select(t => t!).ToList();

Но я получил то же предупреждение !!

Решение (не очень удачное)

Единственный найденный мной обходной путь:

IList<Person> GetPersons()
{
   return someList.Where(t => t != null).Select(t => Some(t)).ToList();
}

// THIS REMOVES THE WARNING
private Person Some(Person? person) => person!;

Однако, если я хочу сделать его обобщенным c, он не работает .... Я снова получаю предупреждение, и этот метод возвращает Person?

private T Some<T>(T? t) where T: class => t!;

Ответы [ 2 ]

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

Используйте в выражении оператор с нулевым прощением, он применяется ко всему выражению и любому из вложенных типов (т. Е. К параметру generi c списка). Или просто приведите к ненулевой версии.

IList<Person> GetPersons() => someList.Where(t => t != null).ToList()!;

// or

IList<Person> GetPersons() => (IList<Person>)someList.Where(t => t != null).ToList();

Проверьте документы заявки:

https://github.com/dotnet/csharplang/blob/master/proposals/csharp-8.0/nullable-reference-types.md#checking -of-nullable-ссылок

В основном преобразование из IList<Person?> в IList<Person> будет рассматриваться как имеющее нулевую ссылку и будет генерировать предупреждения. Но с использованием оператора прощения с нулем он обрабатывается как имеющий ненулевую ссылку (отрицание предупреждения).

0 голосов
/ 27 января 2020

В вашем объявлении метода есть несоответствие.

Попробуйте изменить это:

IList<Person> GetPersons()

на следующее:

IList<Person?> GetPerson
...