编辑:这不是这个question的重复,因为这是一个使用Delegate.CreateDelegate的实际示例,另一个是关于IL的理论讨论。除了单词this和null之外,没有什么可以互相做。
相对于此question ...
我遇到一个在null的实例上调用事件处理程序的情况。奇怪的。看图像:
我不明白发生了什么。如何在null实例上调用实例方法???
答案 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实例上的方法,这不是一个特别有用的东西 做。强>
因此,它被记录为已知的,可能是预期的行为。