Warum ArgumentNullException? Warum nicht System.NullReferenceException?

8

Siehe Codezeile unten:

%Vor%

In diesen Codezeilen habe ich _tables reference und versuche auf sein System zuzugreifen define Funktionen GetType() und Count() , beide werfen Ausnahme, aber warum .Count() throws System.ArgumentNullException , da wir denselben Wert als Referenz haben was ist null ?

    
Ankush Madankar 09.08.2013, 11:36
quelle

4 Antworten

20

Count() ist ein Erweiterungsmethode für IEnumerable<T> , deklariert in System.Linq.Enumerable - also rufst du eigentlich an:

%Vor%

... also _tables ist ein Methodenargument, und es ist sinnvoll, dass die Ausnahme Ihnen das sagt. Sie deaktivieren die _tables -Variable nicht wirklich, wenn Sie Count() aufrufen, während Sie sind, wenn Sie GetType aufrufen.

    
Jon Skeet 09.08.2013, 11:38
quelle
7

Weil Count hier ein Aufruf einer Extension-Methode mit _tables als Argument ist - es ist eigentlich:

%Vor%

Wenn Sie die Erweiterungsmethode nicht verwenden möchten, verwenden Sie _tables.Length .

    
Marc Gravell 09.08.2013 11:38
quelle
4

Weil es eine Erweiterungsmethode und keine Instanzmethode ist.

Da es nach Enumerable.Count(_tables) kompiliert wurde, gilt es nicht für NullReferenceException , es wird stattdessen nur ein ArgumentNullException ausgegeben. % Co_de% ist jedoch eine Instanzmethode. Sie versuchen also, eine Methode für GetType aufzurufen, was ... ähm, nicht funktioniert.

    
It'sNotALie. 09.08.2013 11:38
quelle
4

Count() ist eine Erweiterungsmethode (sie sollte daher eine ArgumentNullException werfen, wenn ein übergebener Wert null ist und null ungültig ist), keine Methode für die Instanz des Objekts, dh Count ist als public static int Count<T>(this IEnumerable<T> source) definiert.

    
Plymouth223 09.08.2013 11:38
quelle