Il seguente codice dovrebbe dare un avvertimento?Perché il metodo Static nasconde il mio metodo di istanza?
class Foo { public void Do() { /*...*/ } /*...*/ }
class Bar : Foo { public static void Do() { /*...*/ } /*...*/ }
Dà:
"Attenzione CS0108:.. 'Bar.Do()' nasconde membro ereditato 'Foo.Do()' Utilizzare la nuova parola chiave se si nasconde è stato destinato"
Se faccio una modifica al codice:
class Foo { public static void Do() { /*...*/ } /*...*/ }
class Bar : Foo { public void Do() { /*...*/ } /*...*/ }
ottengo lo stesso avvertimento.
Se apporto la seguente modifica, tuttavia, l'avviso scompare.
class Foo { public void Do() { /*...*/ } /*...*/ }
class Bar : Foo { new public static void Do() { /*...*/ } /*...*/ }
Permettetemi di fare un ulteriore cambiamento:
class Foo { public void Do() { /*...*/ } /*...*/ }
class Bar : Foo {
new public static void Do()
{ new Bar().Do();/*...*/ } /*...*/
}
Questo non può essere compilato:
"CS0176 Errore: Gli 'Bar.Do()' non è possibile accedere con un'istanza riferimento, qualificarlo con un nome tipo invece. "
Quindi, perdo l'accesso al metodo ereditato tramite un riferimento di istanza da un metodo statico!
Quale sarebbe la logica dietro? O ho fatto un refuso da qualche parte?
Mi sono imbattuto in questo quando stavo cercando di definire un metodo statico 'Mostra' per il mio modulo derivato da 'Form'.
Ciao Jon, +1 per la risposta. Penso che, dal punto di vista dell'utente della lingua, il bug sia nel modo di scegliere il metodo migliore per chiamare :-). Per me, "new Bar(). Do()" indica chiaramente quale metodo viene chiamato in fase di compilazione e non è necessario produrre errori! – isntn
Sospetto che l'alternativa sia quella di rendere il linguaggio molto più complicato. Ci sono spesso casi limite che potrebbero essere migliorati se la lingua fosse più intelligente - ma sarebbe più difficile "conoscere" bene la lingua e anche implementarla correttamente in un compilatore. È tutto equilibrio ... –