Questo è qualcosa che non ho mai notato prima, ma di recente ho incontrato. Quando ho incontrato questa situazione, sono rimasto sorpreso da ciò che il compilatore ha considerato corretto e da ciò che mi ha costretto a fare. Penso che sia più facile descritto attraverso l'esempio.Perché la mia sottoclasse è ancora generica quando fornisco un argomento di tipo alla classe base?
Diciamo che abbiamo una classe base generica con un solo metodo.
abstract class GenericBase<T>
{
public abstract T SomeMethod<T>(T value);
}
Niente pazzo qui. Ora, cerchiamo di estenderla, fornendo una concreta attuazione per int
:
class IntImplementation : GenericBase<int> // T is now, and forever shall be, int
{
public override int SomeMethod(int value)
{
return ++value;
}
}
Sembra abbastanza semplice, giusto? Oppure, così ho pensato ... In effetti, non puoi fare . Il compilatore si lancia il messaggio
'IntImplementation' non implementa ereditato membro astratto 'GenericBase.SomeMethod (T)'
Ma ... T
è ora un int
! Perché non posso semplicemente sostituire questo nel mio override? Risulta l'unico accettabile override
public override T SomeMethod<T>(T value)
che significa il metodo ora deve essere
public override T SomeMethod<T>(T value)
{
return ++((int)value);
}
Wow, che non è affatto generico. In effetti, potrei anche buttare i generici dalla classe base e andare con il buon vecchio object
!
Mind. Soffiato. Sono stato sconcertante su quale potrebbe essere il ragionamento alla base di questo, ma sono in perdita. Qualcuno ha qualche idea?
** Niente di pazzo qui **? Certamente no! Hai dichiarato due diversi parametri di tipo generico entrambi chiamati 'T'. Per favore, non farlo. Dovresti ricevere un avvertimento del compilatore che ti dice che questa è una cattiva pratica che porta a un codice confuso. –
Mi sono imbattuto in una risposta e un commento. Non è giusto. :/Dat tipo argomento argomento generico .... – Will