Я всегда думал, что невозможно, чтобы this
был пустым внутри тела метода экземпляра. Следуя простой программе, это доказывает, что это возможно. Это какое-то документальное поведение?
class Foo
{
public void Bar()
{
Debug.Assert(this == null);
}
}
public static void Test()
{
var action = (Action)Delegate.CreateDelegate(typeof (Action), null, typeof(Foo).GetMethod("Bar"));
action();
}
ОБНОВЛЕНИЕ
Я согласен с ответами, в которых говорится, что этот метод документирован. Однако я не понимаю этого поведения. Тем более, что это не так, как С#.
Мы получили отчет от кого-то (вероятно, одна из групп .NET используя С# (думал, что в то время он еще не был назван С#), который написанный код, который вызвал метод на нулевом указателе, но они didnt получить исключение, потому что метод не имел доступа к каким-либо полям (т.е. "this" был нулевым, но ничто в используемом методе). Тогда этот метод вызвал другой метод, который использовал эту точку, и бросил исключение, и последовало немного царапин на голове. После того, как они это поняли они отправили нам записку об этом. Мы думали, что возможность вызова метода в нулевом экземпляре бит странный. Питер Голде сделал несколько тестов, чтобы понять, всегда использовал callvirt, и он был достаточно мал, чтобы мы решили чтобы внести изменения.
http://blogs.msdn.com/b/ericgu/archive/2008/07/02/why-does-c-always-use-callvirt.aspx