2016-12-20 5 views
3

Wenn ich versuche, .First() für ein aufzählbares Objekt zu verwenden, wird der Fehler "Sequenz enthält keine Elemente" ausgegeben, wenn das Objekt keine Elemente enthält.Warum funktioniert IEnumerable nicht? .First()?

Ich erkenne, dass die Lösung ist .FirstOrDefault(), aber ich verstehe nicht, warum meine ursprüngliche Anstrengung nicht funktioniert. Verkenne ich etwas oder ist es nur eines dieser Dinge?

+0

'IEnumerable' in Ihrem Fall nicht null ist, nur, dass die Sequenz nichts enthält tut. Wenn Ihr IEnumerable-Objekt null wäre, dann hätte sogar 'FirstOrDefault' den Fehler – Developer

Antwort

9

Eine leere Sequenz ist nicht null, es ist ein tatsächliches Objekt, das einfach keine Elemente enthält. ?. ruft das Mitglied in Frage nicht, wenn der Ausdruck null ist, was es nicht ist, so First wird aufgerufen, und First löst eine Ausnahme, wenn es eine leere Sequenz übergeben wird.

+0

ausgelöst. Natürlich scheint es jetzt offensichtlich, dass es erklärt wird! Ich machte eine Vermutung über den Zweck dieses Operators, ohne wirklich darüber nachzudenken. – paulH

4

Weil leere Sammlung nicht null ist.

3

First() löst explizit eine Ausnahme aus, wenn die Sequenz keine Elemente enthält. FirstOrDefault() gibt null, wenn es keine Elemente gibt (bearbeiten: oder vielmehr, es gibt einen Standardwert, der für Referenztypen ist null). Was möchten Sie, dass First() aus einer leeren Sequenz zurückkehrt?

+0

"FirstOrDefault() gibt null, wenn keine Elemente vorhanden sind" ist nicht wahr. Es wird "default (TSource)" geben, was nicht notwendigerweise "null" ist; Dies gilt nur, wenn 'TSource' ein Referenztyp ist. – InBetween

+0

Ja, Sie haben Recht. Das ist eine wichtige Unterscheidung. –

5

Der bedingte Nullenoperator (?) Testet vor dem Ausführen einer Mitgliedszugriffsoperation auf null. Die leere Sequenz ist nicht null, sie enthält nur keine Elemente. Wenn Sie also First() aufrufen, versagt es zu Recht, weil es kein erstes Element gibt.

3

Laut MSDN-Dokumentation:

int? length = customers?.Length; // null if customers is null 
    Customer first = customers?[0]; // null if customers is null 
    int? count = customers?[0]?.Orders?.Count(); // null if customers, the first   customer, or Orders is null 

Deshalb, wenn Sie Ihre Sammlung nicht null ist, dann wird die Laufzeit versuchen, das erste Element zurückzukehren. Da die Sammlung leer ist und Sie FirstOrDefault nicht verwendet haben, wird eine Ausnahme ausgelöst.

-Link: https://msdn.microsoft.com/en-us/library/dn986595.aspx

Verwandte Themen