Question

Je reçois le compilateur avertissement suivant:

'Resources.Foo.GetType()' hides inherited member 'object.GetType()'. Use the new keyword if hiding was intended.    Resources.NET\Resources\Class1.cs   123 20  Resources

pour cela (très simplifié) Code:

public interface IFoo
{
    int GetType();
    string GetDisplayName();
}

public class Foo : IFoo
{
    public int GetType() { return 3; }   *** Warning: points to here (line 123)***
    public string GetDisplayName() { return "Foo"; }
}

Note, ce que je ne comprends pas pourquoi la fonction GetDisplayName () ne soit pas un avertissement. Je méconnais clairement quelque chose.

Je l'ai poussé autour débordement de pile et googlé cette erreur et il semble appliquer à l'héritage des classes, pas des interfaces. Je suis vraiment confus pourquoi ce serait déclenché pour l'interface (qui définit ses méthodes comme virtuelle).

Merci d'avance pour l'aperçu.

Était-ce utile?

La solution

La méthode GetType est définie sur la System.Object , qui est la classe ultime de base de toutes les classes du cadre.

Cette méthode est utilisée pour obtenir le type de l'instance en cours dans l'exécution, et je pense que vous n'êtes pas l'intention de la remplacer (vous avez un type de retour int).

Je vous suggère de changer le nom de la méthode pour GetFooType ou autre chose, ou mettre en œuvre votre interface explicitement pour éviter les problèmes d'exécution.

Autres conseils

Il fait référence à votre cachette méthode GetType de l'objet, non pas de votre interface. Étant donné que votre classe objet inherits et met en œuvre IFoo, et les deux fournissent une méthode GetType, par implicitement implémentant l'interface vous cacher la GetType héritée de l'objet. Si vous voulez toujours votre méthode d'interface appelée à GetType, vous pouvez le mettre en œuvre explicitement au lieu de Foo:

int IFoo.GetType()
{
    return 3;
}

Tous les types .NET proviennent de System.Object.

System.Object définit déjà une méthode nommée GetType. Si vous définissez une autre méthode « GetType » dans votre classe et si quelqu'un crée un objet de votre classe, ils ne peuvent jamais appeler la méthode GetType mis à disposition par System.Object. Ceci est la raison pour laquelle vous obtenez l'avertissement que « GetType » se cache la méthode définie dans System.Object. Vous ne recevez pas cet avertissement pour GetDisplayName parce System.Object (ou pour cette matière une classe parente) ne définit pas cette méthode.

Je vous recommande de changer le nom de votre méthode pour quelque chose d'autre que généralement les développeurs .NET attendent appel getType de se référer à la mise en œuvre System.Object.

Il ne se plaint pas de votre implémentation de l'interface, mais plutôt votre réimplémentation GetType () qui est déjà sur « objet » - à partir de laquelle Foo hérite automatiquement. « Objet » ne dispose pas d'une méthode GetDisplayName et soulève donc aucune plainte pour que celui-ci. Essayez de renommer la méthode ou l'ajout dans le modificateur « nouveau » si vous voulez vraiment cacher object.GetType () mais il est pas recommandé.

classe System.Object a déjà la méthode GetType ()

vous devez utiliser le nouveau mot-clé ou override pour résoudre ce problème

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top