2013-08-09 13 views
8

参照ライン:このコードの行でなぜArgumentNullExceptionですか?なぜSystem.NullReferenceExceptionではないのですか?以下のコードの

DataTable [] _tables = null; 

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

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

私は_tables参照を持っており、そのシステムにアクセスしようとしている機能GetType()Count()を定義し、両方のスロー例外が、なぜ私たちは同じ値を持っているので.Count()は、System.ArgumentNullExceptionをスロー参考のためにnull

+1

[ArgumentNullExceptionまたはNullReferenceExceptionの可能な複製は拡張メソッドからですか?](http://stackoverflow.com/questions/463302/argumentnullexception-or-nullreferenceexception-from-extension-method) –

+0

@ 280Z28私はそのqueでPatrick Hägneは、「nullインスタンスを呼び出す拡張メソッドが呼び出されたときにスローする最高の例外タイプ」を要求します... –

+1

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

答えて

20

Count()System.Linq.Enumerableで宣言され、IEnumerable<T>extension methodです - あなたは実際呼んでいる:

Enumerable.Count(_tables); 

...そう_tablesは、メソッドの引数であり、それは例外のために理にかなっていますあなたにそれを伝える。 Count()を呼び出すときに_tables変数を実際に参照解除していないのに対して、GetTypeに電話するとになります。

+0

"_tables'変数を逆参照することはどういう意味ですか? –

+2

これは参照の実際の値を取得することを意味します(参照は単にアドレスへのポインタなので)。 – Charleh

+0

専門家によってこの答えにすべての概念の言及をクリアしてください..! '拡張メソッド'私はほとんどのinterstingを見つけました。信じられないほどの返信に感謝します。 –

4

Count()は、拡張メソッド(値に渡されたnullで、ヌルが違法である場合、それは従って例外ArgumentNullExceptionをスローする必要があります)、ではない、すなわちCountpublic static int Count<T>(this IEnumerable<T> source)として定義されているオブジェクトのインスタンスのメソッドです。

4

これは拡張メソッドであり、インスタンスメソッドではないためです。

Enumerable.Count(_tables)にコンパイルされているため、NullReferenceExceptionには適用されないため、代わりにArgumentNullExceptionが送信されます。ただし、GetTypeはインスタンスメソッドなので、nullのメソッドを呼び出そうとしていますが、うまくいきません。

7

Countので、ここでの引数として_tablesと拡張メソッドの呼び出しです - それは実際にある:あなたが拡張メソッドを使用しない場合は

System.Linq.Enumerable.Count(_tables); 

_tables.Lengthを使用しています。

関連する問題