编辑:这不是这个问题的重复,因为这是一个使用 Delegate.CreateDelegate 的实际示例,另一个是关于 IL 的理论讨论。除了 this 和 null 这两个词之外,彼此没有任何关系。
相对于这个问题...
我有一种情况,即在为空的实例上调用事件处理程序。诡异的。看图片:
我不明白发生了什么。如何在空实例上调用实例方法???
您可以使用Delegate.CreateDelegate重载创建此案例,您可以在其中null
为调用目标提供参考。
class Foo
{
public void Method()
{
Console.WriteLine(this == null);
}
}
Action<Foo> action = (Action<Foo>)Delegate.CreateDelegate(
typeof(Action<Foo>),
null,
typeof(Foo).GetMethod("Method"));
action(null); //prints True
从该页面上的 MSDN 评论中:
如果 firstArgument 是空引用并且 method 是实例方法,则结果取决于委托类型类型和方法的签名:
• 如果类型的签名显式地包括隐藏的方法的第一个参数,则称委托代表一个开放的实例方法。当委托被调用时,参数列表中的第一个参数被传递给方法的隐藏实例参数。
• 如果方法和类型的签名匹配(即所有参数类型都兼容),则称委托在空引用上关闭。调用委托就像在空实例上调用实例方法一样,这并不是一件特别有用的事情。
因此,它被记录为已知的并且可能是有意的行为。