2011-09-06 18 views
8

Esiste una classe base che ha un metodo di tipo generico e sono sicuro che nel mio derivato restituirò una stringa. Questo è il mio codice:La dichiarazione del parametro di tipo deve essere un identificatore non un tipo

public abstract class Base 
    { 
     public virtual T GetSomething<T>() 
     { 
      return default(T); 
     } 
    } 

    public class Extended : Base 
    { 
     public override string GetSomething<string>() 
     { 
      return string.Empty; 

      //return base.GetSomething<T>(); 
     } 
    } 

Ma questo codice non viene compilato. Qualcuno può individuare l'errore? Sono sicuro che nella mia classe estesa voglio solo restituire una stringa. Come lo risolvo?

risposta

8

Non è possibile sovrascrivere un metodo generico con un'implementazione concreta; non è così che funzionano i farmaci generici. La classe Extended deve essere in grado di gestire le chiamate a GetSomething<int>() ad esempio.

In altre parole, la firma per un metodo prevalente deve essere identica a per il metodo che esegue l'override. Specificando un'implementazione generica concreta del metodo, si modifica la propria firma.

considerare l'utilizzo di questo approccio:

public override T GetSomething<T>() 
{ 
    if (typeof(T) == typeof(string)) 
     return string.Empty; 

    return base.GetSomething<T>(); 
} 

Si noti che il JIT dovrebbe ottimizzare il via il condizionale quando si compila una particolare istanza di questo metodo. (In caso contrario, non è un ottimo JIT!)

(La sintassi per la sostituzione è tecnicamente corretta, ma non riesce anche per altri motivi. Ad esempio, non è possibile utilizzare la parola chiave string come nome del parametro generico. E se poteste, il vostro codice non farebbe mai ciò che volete, né verrebbe compilato, dal momento che il compilatore non sarebbe in grado di trovare un metodo con quella firma su un supertipo.)

+2

o cambiare la base dichiarazione di classe a 'classe astratta pubblica Base ' – Eranga

+0

Forse, e poi 'Esteso: Base '. Questo è certamente possibile. Non è immediatamente chiaro che cosa sta cercando di realizzare l'OP, quindi ho scelto l'approccio che richiede un minimo cambiamento nel design della classe. – cdhowie

Problemi correlati