怎么会这个== null?

时间:2013-07-16 11:47:04

标签: c# .net events null

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

相对于此question ...

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

enter image description here

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

1 个答案:

答案 0 :(得分: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

来自该页面上的MSDN评论:

  

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

     

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

     

•如果方法和类型的签名匹配(即所有参数   类型是兼容的),然后委托被称为关闭   空引用。调用委托就像调用实例一样   在null实例上的方法,这不是一个特别有用的东西   做。

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