2013-08-09 15 views
8

Siehe Codezeile unter:Warum ArgumentNullException? Warum nicht System.NullReferenceException?

DataTable [] _tables = null; 

// Throws System.NullReferenceException 
_tables.GetType(); 

// Throws System.ArgumentNullException 
_tables.Count(); 

In dieser Zeilen Code Ich habe _tables Referenz und versucht, sein System für den Zugriff auf Funktionen definieren GetType() und Count(), beide Ausnahme throw aber warum .Count()System.ArgumentNullException wirft, da wir denselben Wert haben als Referenz das ist null?

+1

möglich Duplikat von [ArgumentNullException oder NullReferenceException von der Erweiterungsmethode?] (Http://stackoverflow.com/questions/463302/argumentnullexception-or-ullreferenceexception-from-extension-method) –

+0

@ 280Z28 Ich denke in diesem que, Patrik Hägne fragt nach "best exception type to throw, wenn eine Erweiterungsmethode eine Null-Instanz aufgerufen hat" ... –

+1

http://blog.mischel.com/2013/05/16/null-parameters-in-extension-methods/ –

Antwort

20

Count() ist ein extension method auf IEnumerable<T>, in System.Linq.Enumerable erklärt - so sind Sie tatsächlich calling:

Enumerable.Count(_tables); 

... so _tablesist ein Verfahren Argument, und es macht Sinn für die Ausnahme um es dir zu sagen. Sie werden die _tables-Variable nicht wirklich dereferenzieren, wenn Sie Count() aufrufen, während Sie sind, wenn Sie GetType aufrufen.

+0

Was meinst du mit "Dereferenzierung der' _tables' Variable "? –

+2

Es bedeutet, den tatsächlichen Wert der Referenz zu erhalten - Dereferenzierung (da eine Referenz nur ein Zeiger auf eine Adresse ist). – Charleh

+0

Löschen Sie alle Konzept Erwähnung in dieser Antwort von Experten ..! "Erweiterungsmethode" fand ich am interessantesten.Vielen Dank für Ihre wertvollen Antworten. –

4

Count() ist ein Erweiterungsmethode (es daher ein Argument werfen soll, wenn ein in gebene Wert ist null und nichtig ist illegal), ist kein Verfahren für die Instanz des Objekts Count d.h. als public static int Count<T>(this IEnumerable<T> source) definiert.

4

Weil es eine Erweiterungsmethode und keine Instanzmethode ist.

Da es kompiliert zu Enumerable.Count(_tables) ist, gilt es nicht für NullReferenceException, so dass es nur eine ArgumentNullException stattdessen wirft. GetType ist jedoch eine Instanzmethode, also versuchen Sie, eine Methode auf null aufzurufen, die ... ähm, funktioniert nicht.

7

Da Count hier ist ein Aufruf zu einer Erweiterung-Methode mit _tables als Argument - es ist eigentlich:

System.Linq.Enumerable.Count(_tables); 

Wenn Sie die Erweiterung Methode nicht verwenden wollen: _tables.Length verwenden.