8

以下のコード行を参照してください。

DataTable [] _tables = null;

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

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

このコード行では、_tables参照があり、そのシステム定義関数GetType()とにアクセスしようとしていますが、両方とも例外をスローしますが、参照の値が同じであるため、Count()なぜ.Count()スローするのですか?System.ArgumentNullExceptionnull

4

4 に答える 4

20

Count()-で宣言されたonの拡張メソッドであるため、実際に呼び出しているのは次のとおりです。IEnumerable<T>System.Linq.Enumerable

Enumerable.Count(_tables);

... メソッドの引数もそう_tables です。例外がそれを伝えるのは理にかなっています。を呼び出すときは実際には_tables変数を逆参照していませんCount()、呼び出すときは逆参照しています。GetType

于 2013-08-09T11:38:09.753 に答える
7

Countこれは、引数として拡張メソッドを呼び出しているため_tablesです。実際には次のとおりです。

System.Linq.Enumerable.Count(_tables);

拡張メソッドを使用したくない場合: use _tables.Length.

于 2013-08-09T11:38:41.843 に答える
4

インスタンスメソッドではなく、拡張メソッドだからです。

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

于 2013-08-09T11:38:38.543 に答える
4

Count()は拡張メソッドです (したがって、渡された値が null で null が不正な場合は ArgumentNullException をスローする必要があります)。オブジェクトのインスタンスのメソッドではありません。つまり、Countとして定義されていpublic static int Count<T>(this IEnumerable<T> source)ます。

于 2013-08-09T11:38:33.427 に答える