2016-11-01 2 views
3

Es ist mein Code (es im Netz Kernprojekt verwendet wird):Null Konditionaloperator und LINQ

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

Es wirft Nullreferenceexception, wenn RelatedEntityCanBeNull null für Benutzer ist. Warum gibt der Ausdruck nicht null zurück?

+1

Im Gespräch über den Zugriff auf 'user' Eigenschaften zu ändern, sollte es nicht' Benutzer sein .RelatedEntityCanBeNull .ToListAsync();? ' ? Sie greifen auf "Benutzer" ohne Null-bedingten Operator zu, und es ist null, und es gibt einen Fehler. Ich bin mir jedoch nicht sicher, wie "erwarten" mit "null" Aufgaben arbeiten. –

+3

Ich vermute es liegt daran, dass Sie hier auf eine Null-Aufgabe warten. –

+0

@ Yeldar Kurmangaliyev, ich überprüft Benutzer explizit. Es ist nicht null – Mergasov

Antwort

4

Der Operator wartet erwartet ein erwartetes Objekt Task. Der Bedingungsoperator Null gibt null und await null Ergebnisse in NullReferenceException zurück.

Sie haben Ihren Code

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

oder

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

oder 'await (user.RelatedEntityCanBeNull? .ToListAsync() ?? Task.FromResult <...> (null));' um prägnanter zu sein. –

+0

@ stop-cran: Guter Punkt –

+0

@ stop-cran Ihre Entscheidung lassen manuelle null -check entkommen, auch wenn es langkettige Eigenschaften in Ausdruck wie folgt ist: user.First? .Second? ... groß – Mergasov