扩展方法的空引用异常

时间:2015-10-16 20:42:57

标签: c# extension-methods nullreferenceexception

我有一个名为ParseItemsToIntegers的扩展方法,它是一个字符串数组的扩展方法,我正在使用它,就像使用任何扩展一样。

var ids = ChkBoxSelected.ParseItemsToIntegers();

我观察到的行为是,如果ChkBoxSelected为null,它将调用扩展方法而没有问题,但是在扩展方法中它会在空字符串数组上抛出空引用异常。

如何解决null上的扩展方法?

为什么在调用扩展方法时,它不会在ChkBoxSelected上抛出空引用异常?

3 个答案:

答案 0 :(得分:6)

它不会抛出NRE,因为扩展方法不是实例方法,无论它们出现多少是实例方法。正如您在定义方法时所表明的那样,它实际上是一种静态方法。将null值作为第一个参数传递给静态方法时,不会抛出NRE,它只传入null值,静态方法可以随意执行任何操作。

答案 1 :(得分:1)

调用扩展方法ChkBoxSelected.ParseItemsToIntegers()等同于使用常规静态方法语法ParseItemsToIntegers(ChkBoxSelected)调用它。 ChkBoxSelected的类型在编译时是已知的,因此编译器可以解析该方法。

NullReferenceException在尝试使用ChkBoxSelected的方法中抛出。

调用实例方法时,会立即抛出NullReferenceException,因为CLR会检查对象的实际类型以选择正确的多态调用(即使非虚拟方法也是如此)。

答案 2 :(得分:1)

扩展方法只是一种更明确的static方法调用的语法糖。

所以你的代码可能出现(它不是)

null.ParseItemsToIntegers();

真的被称为

StaticClass.ParseItemsToIntegers(null);

null引用只是一个参数,完全可以接受null作为值(因为它是引用类型的合法值)。在你的实际方法中的某个地方,它可能是期望一个非空数组,然后抛出一个NPE。