C# 扩展方法的空引用异常

C# 扩展方法的空引用异常,c#,extension-methods,nullreferenceexception,C#,Extension Methods,Nullreferenceexception,我有一个名为ParseItemsToIntegers的扩展方法,它是字符串数组的扩展方法,我使用它就像使用任何扩展一样 var ids = ChkBoxSelected.ParseItemsToIntegers(); 我观察到的行为是,如果ChkBoxSelected为null,它将毫无问题地调用扩展方法,但在扩展方法的旁边,它会在null字符串数组上抛出null引用异常 它是如何解析null上的扩展方法的 当我调用扩展方法时,为什么它没有在ChkBoxSelected上抛出空引用异常?它不会

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

var ids = ChkBoxSelected.ParseItemsToIntegers();
我观察到的行为是,如果
ChkBoxSelected
为null,它将毫无问题地调用扩展方法,但在扩展方法的旁边,它会在null字符串数组上抛出null引用异常

它是如何解析null上的扩展方法的


当我调用扩展方法时,为什么它没有在
ChkBoxSelected
上抛出空引用异常?

它不会抛出NRE,因为扩展方法不是实例方法,不管它们看起来是实例方法的多少。正如在定义方法时所明确指出的,它实际上是一个静态方法。当您将
null
值作为第一个参数传递给静态方法时,不会抛出NRE,它只传递
null
值,静态方法可以对其执行任何操作。

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

NullReferenceException
被抛出到它试图使用
ChkBoxSelected
的方法中


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

扩展方法只是更显式的
静态
方法调用的语法糖

所以你的代码看起来可能是(不是)

真的被称为

StaticClass.ParseItemsToIntegers(null);

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

尝试{…if(return==null){return-1}}Catch{return-1}不,我得到了Dieter B。我很好奇为什么它不在顶层抛出null引用。它是如何进入null对象上的扩展方法的?因为它在类型上搜索扩展方法,而不是对象本身。扩展方法实际上只是静态方法调用。您“调用它们”的任何对象都只是作为第一个参数传递。
StaticClass.ParseItemsToIntegers(null);