Impossible d'expliquer ce qui se passe dans le programme suivant. GetType retourne le type que je veux retourner et non l'original. Cela signifie-t-il que nous ne pouvons pas compter sur GetType? l'opérateur a raison cependant. Quelqu'un peut-il l'expliquer en détail?GetType renvoie des informations différentes de celles utilisées par l'opérateur
using System;
namespace ConsoleApplication2
{
public class MyClass
{
public Type GetType()
{
return typeof(Program);
}
}
class Program
{
static void Main(string[] args)
{
MyClass mc = new MyClass();
if (mc.GetType() == typeof(Program))
{
Console.WriteLine("Confused.");
}
if(mc is Program)
{
Console.WriteLine(mc.GetType()); // Don't get inside the if. Why?
}
}
}
}
Mise à jour: Je lis le CLR livre via C# 3e édition. Dans le chapitre 4 (2ème page) quand il explique les méthodes différentes System.Object il dit
« La méthode GetType est nonvirtual, qui empêche une classe redéfinissant cette méthode et mentir sur son type »
Alors que je suis d'accord sur la première déclaration, je mens sur le type MyClass. n'est-ce pas?
Pouvez-vous confirmer que la confusion est que mc.GetType() == typeof (Program) évalue réellement à vrai? –
Oui. En fait, il semble que l'opérateur utilise un mécanisme différent pour vérifier le type que GetType(). Si oui, quel est le mécanisme? Aussi le programme ci-dessus montre que nous ne pouvons pas faire confiance à GetType pour renvoyer le type correct. – Tanmoy
Je pense que vous êtes confus à propos de la différence entre la création d'une méthode ** new ** (masquer une méthode ancêtre) et ** overriding ** d'une méthode ancêtre. Eric Lippert a récemment eu [un article de blog] (http://blogs.msdn.com/b/ericlippert/archive/2010/03/29/putting-a-base-in-the-middle.aspx) qui touche à cette (il y en a probablement d'autres, mais c'est le premier que j'ai pu trouver). La lecture pourrait vous aider à comprendre ce qui se passe ici. –