2016-11-01 3 views
3

Существует мой код (используется в сети основного проекта):Null условный оператор и LINQ

var list = await user.RelatedEntityCanBeNull?.ToListAsync(); 

Он бросает NullReferenceException если RelatedEntityCanBeNull является недействительным для пользователя. Почему выражение не возвращает null?

+1

Говоря о доступе к 'свойства user', не должна быть' пользователь .RelatedEntityCanBeNull .ToListAsync();? ' ? Вы получаете доступ к 'user' без оператора с нулевым условием, и он равен null, и он дает ошибку. Тем не менее, я не уверен, как «ожидание» работает с задачами «null». –

+3

Я подозреваю, что это потому, что вы ожидаете нулевой «Задачи». –

+0

@ Йельдар Курмангалиев, я проверил пользователя явно. Это не null – Mergasov

ответ

4

Ожидающий оператор ожидает ожидаемого объекта Task. Условный оператор Null возвращает null и await null приводит к NullReferenceException.

Вы должны изменить свой код

List list = null; 
if (user?.RelatedEntityCanBeNull != null) 
    list = await user.RelatedEntityCanBeNull.ToListAsync(); 

или

var list = user?.RelatedEntityCanBeNull == null ? null : await user.RelatedEntityCanBeNull.ToListAsync(); 
+2

или 'await (user.RelatedEntityCanBeNull? .ToListAsync() ?? Task.FromResult <...> (null));' быть более кратким. –

+0

@ stop-cran: Хорошая точка –

+0

@ stop-cran ваше решение позволяет избежать ручного null -check, даже если в выражении есть такие длинные свойства цепи: user.First? .Second? ... great – Mergasov

Смежные вопросы