怎么可能这个== 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实例上调用实例方法一样,这不是特别有用的事情。
因此,它被记录为已知的,可能是预期的行为。