Подтвердить что ты не робот

Как может быть, что это == null?

EDIT. Это не дубликат этого question, так как этот пример является практическим примером работы с Delegate.CreateDelegate и другой - теоретическая дискуссия об ИЛ. Ничего не делать друг с другом, кроме слов this и null.

Относительно этого question...

У меня есть ситуация, когда обработчик события вызывается в экземпляре, который является нулевым. Weird. Посмотрите на изображение:

enter image description here

Я не понимаю, что происходит. Как метод экземпляра может быть вызван в нулевом экземпляре???

4b9b3361

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

Таким образом, это задокументировано как известное и, возможно, предполагаемое поведение.