2016-05-17 13 views
5

Considerate questa classe:C'è qualche vantaggio nell'utilizzo del parametro del tipo di riferimento generico, se l'interfaccia della classe è controvariante?

class MyClass<T> where T: class // or T: BaseClass 
{ 
    void DoSomething1(T arg){ ... } 
    void DoSomething2(T arg){ ... } 
    ... 
    void DoSomethingN(T arg){ ... } 
} 

e non c'è nessun ritorno di T valori! Anche in proprietà o campo protetti, quindi i discendenti non possono restituire T pure.

C'è qualche vantaggio nell'utilizzare un parametro generico qui rispetto al tipo di classe base solo hardcoded?

+1

Non vedo il problema/domanda qui. Perché vuoi avere le funzioni per restituire 'T'? 'T' è usato come parametro. Nel tuo esempio il vincolo si riferisce all'abilità 'referenziale' di 'T'. Se aveste scelto 'T: BaseClass', potrebbe non esserci alcun caso di utilizzare un parametro generico. – ckruczek

+0

Direi di no, perché non vedo alcuna possibilità di usare il tipo concreto - se non può essere usato, non c'è alcun valore nel definirlo. – JanDotNet

+0

@JNS Potrebbe esserci spazio per l'ottimizzazione. Nel caso in cui T sia una classe sigillata, il compilatore può emettere una chiamata senza necessità di guardare in VMT? –

risposta

0

No, non c'è alcun vantaggio. Poiché si passano solo i parametri di tipo T, i metodi sono essenzialmente contravariant, quindi si potrebbe anche dichiarare di prendere un riferimento anziché uno T.