Avertissement "Utilisez le nouveau mot-clé si le masquage était voulu"

101

J'ai un avertissement en bas de mon écran:

Avertissement 1 'WindowsFormsApplication2.EventControlDataSet.Events' masque le membre hérité 'System.ComponentModel.MarshalByValueComponent.Events'. Utilisez le nouveau mot-clé si la cache était destinée. C: \ Users \ myComputer \ Desktop \ Event Control \ WindowsFormsApplication2 \ EventControlDataSet.Designer.cs 112 32 eventControl

Si je double-clique dessus, il apparaît:

public EventsDataTable Events {
    get {
        return this.tableEvents;
    }

Quelqu'un peut-il me dire comment s'en débarrasser?

tony b
la source

Réponses:

145

Votre classe a une classe de base, et cette classe de base a également une propriété (qui n'est pas virtuelle ou abstraite) appelée Events qui est remplacée par votre classe. Si vous avez l'intention de le remplacer, placez le mot clé "new" après le modificateur public. PAR EXEMPLE

public new EventsDataTable Events
{
  ..
}

Si vous ne souhaitez pas le remplacer, changez le nom de vos propriétés en autre chose.

wdavo
la source
23
Voici un lien pour tous ceux qui veulent savoir quelle est la différence entre nouveau et remplacement.
starsplusplus
Le new mot clé éliminerait l'erreur de compilation, mais pourrait introduire un autre comportement involontaire. Je pense que vous devriez ajouter un avertissement à votre réponse. Cela serait utile pour comprendre les conséquences de l'ajout new.
ahong
13

@wdavo est correct. Il en va de même pour les fonctions.

Si vous remplacez une fonction de base, comme Update, vous avez besoin dans votre sous-classe:

new void Update()
{
  //do stufff
}

Sans le nouveau au début de la déclinaison de la fonction, vous obtiendrez le drapeau d'avertissement.

Agresseur
la source
6

Dans le code ci-dessous, Class Aimplémente l'interface IShowet implémente sa méthode ShowData. Class Bhérite Class A. Pour utiliser la ShowDataméthode dans Class B, nous devons utiliser le mot-clé newdans la ShowDataméthode afin de masquer la Class Améthode de la classe de base et utiliser le overridemot-clé afin d'étendre la méthode.

interface IShow
{
    protected void ShowData();
}

class A : IShow
{
    protected void ShowData()
    {
        Console.WriteLine("This is Class A");
    }
}

class B : A
{
    protected new void ShowData()
    {
        Console.WriteLine("This is Class B");
    }
}
Joee
la source
3
Il n'y a pas overridedans votre exemple de votre explication et overriden'est pas nécessaire.
Etienne Faucher
Je pense que votre exemple est sur la bonne voie, mais il est incomplet. De plus, votre explication n'est pas claire. Pourriez-vous modifier votre réponse pour qu'elle ressemble plus à dotnetfiddle.net/Iw0OzB ? Sinon, je publierai probablement mon violon comme une autre réponse
ahong le
0

La fonction parent a besoin du virtualmot - clé, et la fonction enfant a besoin du overridemot - clé devant la définition de fonction.

James L.
la source