2016-07-01 10 views
0

In dem folgenden Programm löst (!testlist.Any()) eine Argument-Null-Ausnahme aus. Übernimmt die Any() - Erweiterungsmethode standardmäßig keine Nullwerte?Behebt die Erweiterungsmethode Any() Nullwerte?

Was ist der richtige Ansatz dafür? Sollte vor Any() eine Nullprüfung hinzugefügt werden, wenn List<int> als Parameter in einer Methode verwendet wird?

public class Program 
    { 
     public static void Main(string[] args) 
     { 

      Console.WriteLine("Hello, world!"); 

      foo(null); 
     } 

     public static void foo(List<int> testlist) 
     { 
      if (!testlist.Any()) 
      { 
       Console.WriteLine("testlist is empty!"); 
      } 
     } 
    } 
+0

'if (!? Testlist .Any() ?? false) {doStuff (Testliste); } 'Es sei denn, Sie möchten die Ausnahme erneut werfen. – Mephy

+4

Er "behandelt" den Nullwert für die Sammlung, indem er die Ausnahme auslöst. –

+0

löst eine 'ArgumentNullException' aus, wenn 'Quelle oder Prädikat Null ist' –

Antwort

6

Sollte eine NULL-Prüfung vor Any(), wenn Liste hinzugefügt wird, wird als Parameter in einem Verfahren verwendet?

Ja, das ist der richtige Ansatz. Die Methode sollte schnell mit einer sinnvollen Nachricht fehlschlagen.

public static void foo(List<int> testlist) 
{ 
    if(testlist == null) 
     throw new ArgumentNullException(nameof(testlist), $"{nameof(testlist)} must not be null"); 
    if (!testlist.Any()) 
    { 
     Console.WriteLine("testlist is empty!"); 
    } 
} 

Natürlich Enumerable.Any bedeutet dies für Sie nicht behandeln. Es könnte ein Fehler sein, dass null an diese Methode übergeben wurde, oder es könnte eine praktikable Option sein. Nur Sie wissen.

Die Ausnahme ist auch documented:

"ArgumentNullException: Quelle null ist."

Wenn Sie nicht wollen, es zu werfen, aber Sie wollen null akzeptieren, verarbeiten nur diesen Fall:

if(testlist == null || !testlist.Any()) 
{ 
    Console.WriteLine("testlist is null or empty!"); 
} 
else .... 
+0

Oder es sollte überhaupt nicht fehlschlagen, wenn der Vertrag für die Methode besagt, dass eine Null 'testList' OK ist. Ich denke nicht, dass dies eine gute Lösung ist, aber es könnte einen Grund geben, warum das OP in dieser Situation ist. –

+0

Die Benutzer, die diese Methode verwenden, sind nicht technisch. Sie können weiterhin Nullwerte übergeben und die Methode kann in diesem Fall "emptylist" zurückgeben –