怎么可能这个== null?

编辑 :这不是这个问题的重复,因为这是一个使用Delegate.CreateDelegate的实际例子,另一个是关于IL的理论讨论。 除了单词this和null之外,没有什么可以互相做。

相对于这个问题 ……

我遇到一个在null的实例上调用事件处理程序的情况。 奇怪的。 看图像:

在此处输入图像描述

我不明白发生了什么。 如何在null实例上调用实例方法???

您可以使用Delegate.CreateDelegate重载创建此案例,您可以在其中为调用目标提供null引用。

 class Foo { public void Method() { Console.WriteLine(this == null); } } Action action = (Action)Delegate.CreateDelegate( typeof(Action), null, typeof(Foo).GetMethod("Method")); action(null); //prints True 

从该页面上的MSDN备注:

如果firstArgument是空引用而method是实例方法,则结果取决于委托类型类型和方法的签名:

•如果类型的签名明确包含隐藏的方法的第一个参数,则表示委托表示开放实例方法。 调用委托时,参数列表中的第一个参数将传递给方法的隐藏实例参数。

•如果方法和类型的签名匹配(即,所有参数类型都是兼容的),则表示委托在空引用上关闭。 调用委托就像在null实例上调用实例方法一样,这不是特别有用的事情。

因此,它被记录为已知的,可能是预期的行为。