我有一个名为ParseItemsToIntegers
的扩展方法,它是一个字符串数组的扩展方法,我正在使用它,就像使用任何扩展一样。
var ids = ChkBoxSelected.ParseItemsToIntegers();
我观察到的行为是,如果ChkBoxSelected
为null,它将调用扩展方法而没有问题,但是在扩展方法中它会在空字符串数组上抛出空引用异常。
如何解决null上的扩展方法?
为什么在调用扩展方法时,它不会在ChkBoxSelected
上抛出空引用异常?
答案 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。