怎么会这个== null?

Ign*_*cia 27 .net c# null events

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

相对于这个问题 ......

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

在此输入图像描述

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

Chr*_*air 34

您可以使用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
Run Code Online (Sandbox Code Playgroud)

从该页面上的MSDN备注:

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

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

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

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

  • 我认为这是允许的,这很奇怪.我希望`Delegate.CreateDelegate`在这种情况下抛出异常.我想不出你想要在没有实例的情况下调用实例方法的单个用例... (3认同)