Ответ 1
Вы можете создать этот случай, используя 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 ссылка. Вызов делегата - это вызов вызова экземпляра метод на нулевом экземпляре, что не особенно полезно для сделать.
Таким образом, это задокументировано как известное и, возможно, предполагаемое поведение.