8

请参见下面的代码行:

DataTable [] _tables = null;

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

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

在这行代码中,我有_tables参考并试图访问它的系统定义函数GetType(),并且Count()都抛出异常但为什么.Count()会抛出System.ArgumentNullException,因为我们有相同的参考值是null什么?

4

4 回答 4

20

Count()是一个扩展方法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);

如果您不想使用扩展方法:使用_tables.Length.

于 2013-08-09T11:38:41.843 回答
4

Count()是一种扩展方法(因此,如果传入的值为 null 并且 null 是非法的,则它应该抛出 ArgumentNullException),而不是对象实例上的方法,即Count定义为public static int Count<T>(this IEnumerable<T> source).

于 2013-08-09T11:38:33.427 回答
4

因为它是扩展方法,而不是实例方法。

当它编译为 时Enumerable.Count(_tables),它不适用于NullReferenceException,所以它只是抛出一个ArgumentNullException。但是,GetType是一个实例方法,所以你试图在 上调用一个方法null,这......嗯,不起作用。

于 2013-08-09T11:38:38.543 回答