28

编辑:这不是这个问题的重复,因为这是一个使用 Delegate.CreateDelegate 的实际示例,另一个是关于 IL 的理论讨论。除了 this 和 null 这两个词之外,彼此没有任何关系。

相对于这个问题...

我有一种情况,即在为空的实例上调用事件处理程序。诡异的。看图片:

在此处输入图像描述

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

4

1 回答 1

35

您可以使用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 是实例方法,则结果取决于委托类型类型和方法的签名:

• 如果类型的签名显式地包括隐藏的方法的第一个参数,则称委托代表一个开放的实例方法。当委托被调用时,参数列表中的第一个参数被传递给方法的隐藏实例参数。

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

因此,它被记录为已知的并且可能是有意的行为。

于 2013-07-16T11:58:34.123 回答