Domanda

Sto ottenendo il seguente compilatore Attenzione:

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

per questo codice (molto semplificato):

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"; }
}

Si noti, quello che non capisco è il motivo per cui la funzione GetDisplayName () non riceve un avvertimento. Sto chiaramente sottovalutando qualcosa.

Ho curiosato Stack Overflow e googled questo errore e sembra applicarsi a ereditarietà di classe, non interfacce. Sono molto confuso perché questo sarebbe attivato per l'interfaccia (che definisce i suoi metodi come virtuale).

Grazie in anticipo per la comprensione.

È stato utile?

Soluzione

Il GetType metodo è definito sulla System.Object classe, che è la classe base ultimo di tutte le classi del quadro.

Questo metodo viene utilizzato per ottenere il Tipo di l'istanza corrente in fase di esecuzione, e penso che non si intende eseguire l'override di esso (si dispone di un tipo int di ritorno).

Vi suggerisco di rinominare il metodo per GetFooType o qualcosa d'altro, o implementare l'interfaccia esplicitamente per evitare problemi di esecuzione.

Altri suggerimenti

Si riferisce al metodo nascondiglio GetType da oggetto, non dall'interfaccia. Dal momento che l'oggetto eredita di classe e implementa IFoo, ed entrambi forniscono un metodo GetType, da implicitamente che implementa l'interfaccia si nascondere il GetType ereditato da Object. Se si vuole ancora il metodo di interfaccia per essere chiamato GetType, è possibile implementare che esplicitamente invece in Foo:

int IFoo.GetType()
{
    return 3;
}

Tutti i tipi di .NET derivano da System.Object.

System.Object definisce già un metodo denominato GetType. Se si definisce un altro metodo 'GetType' nella classe e se qualcuno crea un oggetto della classe, non possono mai chiamare il metodo GetType messo a disposizione da System.Object. Questa è la ragione che si stanno ottenendo l'avviso che 'GetType' nasconde il metodo definito in System.Object. Non si ottiene questo avvertimento per GetDisplayName perché System.Object (o per quella materia qualsiasi classe genitore) non definisce questo metodo.

mi sento di raccomandare che si cambia il nome del metodo da qualcosa d'altro come in genere gli sviluppatori di .NET si aspettano metodo GetType chiamata a fare riferimento alla realizzazione System.Object.

Non lamentarsi l'implementazione dell'interfaccia, ma piuttosto la vostra reimplementazione di GetType () che è già sul "oggetto" - da cui Foo eredita automaticamente. "Oggetto" non ha un metodo GetDisplayName e solleva quindi nessuna lamentela per quello. Provare a rinominare il metodo o l'aggiunta del modificatore "nuova" se si vuole veramente nascondere object.GetType () anche se non è consigliabile.

classe System.Object ha già il metodo GetType ()

si dovrebbe usare la parola chiave di nuovo o di sostituzione per risolvere questo problema

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top