2013-08-09 11 views
8

vedere la linea di codice qui sotto:Perché ArgumentNullException? Perché non System.NullReferenceException?

DataTable [] _tables = null; 

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

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

In queste righe di codice che ho _tables di riferimento e che tentano di accedere al proprio sistema di definire funzioni GetType() e Count(), sia eccezione tiro ma perché .Count() tiri System.ArgumentNullException, dal momento che abbiamo lo stesso valore per riferimento che è null?

+1

possibile duplicato di [ArgumentNullException o NullReferenceException dal metodo di estensione?] (Http://stackoverflow.com/questions/463302/argumentnullexception-or-nullreferenceexception-from-extension-method) –

+0

@ 280Z28 Penso che in que que, Patrik Hägne chiede il "miglior tipo di eccezione da lanciare quando un metodo di estensione chiamato su un'istanza null" ... –

+1

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

risposta

20

Count() è un extension method su IEnumerable<T>, ha dichiarato in System.Linq.Enumerable - in modo che stai realtà chiamata:

Enumerable.Count(_tables); 

... quindi _tablesè un argomento del metodo, e ha senso per l'eccezione per dirti questo. In realtà, non stai delegando la variazione della variabile quando chiami Count(), mentre tu sono quando chiami GetType.

+0

Cosa intendi per "dereferenziare la variabile' _tables' "? –

+2

Significa ottenere il valore effettivo del riferimento - dereferenziazione (poiché un riferimento è solo un puntatore a un indirizzo). – Charleh

+0

Cancella ogni concetto menzionato in questa risposta dagli esperti ..! 'metodo di estensione' Ho trovato più interessante.Grazie a tutti per le risposte consapevoli. –

4

Count() è un metodo di estensione (dovrebbe quindi gettare un'ArgumentNullException se un passato in valore è nullo e nullo è illegale), non un metodo per l'istanza dell'oggetto cioè Count è definito come public static int Count<T>(this IEnumerable<T> source).

4

Perché è un metodo di estensione e non un metodo di istanza.

Poiché è compilato a Enumerable.Count(_tables), non si applica a NullReferenceException, quindi viene semplicemente lanciato un ArgumentNullException. Tuttavia, GetType è un metodo di istanza, quindi stai provando a chiamare un metodo su null, che ... um, non funziona.

7

Perché Count ecco un chiamata a un interno-metodo con _tables come argomento - che è in realtà:

System.Linq.Enumerable.Count(_tables); 

Se non si desidera utilizzare il metodo di estensione: utilizzare _tables.Length.