J'ai toujours pensé que c'est impossible this
nulle à l'intérieur de la méthode d'instance corps. Suivant programme simple montre qu'il est possible. Ce n'est pas documentée de comportement?
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();
}
Mise à JOUR
Je suis d'accord avec les réponses en disant que c'est la façon dont cette méthode est documenté. Cependant, je ne comprends pas vraiment ce comportement. Surtout parce que c'est pas comment C# est conçu.
Nous avons eu un rapport de quelqu'un (probablement l'un de la .NET les groupes à l'aide de C# (pensé qu'il n'était pas encore nommé C# à l'époque)) qui avait écrit le code qui appelle une méthode sur un pointeur null, mais ils n'ont pas obtenez une exception parce que la méthode n'a pas accès à tous les champs (c'est à dire "ce" a été nulle, mais rien dans la méthode utilisée). Cette méthode, puis d'appeler une autre méthode qui n'utiliser ce point et a jeté un exception, et un peu de casse-tête s'ensuivit. Après ils ont compris hors, ils nous ont envoyé une note à ce sujet. Nous avons pensé que le fait de pouvoir appeler une méthode sur une instance null est une peu bizarre. Peter Golde fait quelques tests pour voir quel est l'impact de la perf était toujours à l'aide de callvirt, et il était assez petit, que nous avons décidé pour effectuer le changement.
http://blogs.msdn.com/b/ericgu/archive/2008/07/02/why-does-c-always-use-callvirt.aspx