2011-08-31 16 views
6

Volevo codificare un metodo helper in Unit test project, che inizializzerà il presenter impostando l'istanza delle viste su di esso e impostando lo stato del relatore.Il parametro type non può essere utilizzato con gli argomenti tipo

Mi ha generato l'eccezione:

il parametro di tipo non può essere utilizzato con argomenti di tipo

Codice:

public static **TPresenter<TView>** Initialize<TPresenter,TView>() 
    where TPresenter: BasePresenter<TView>, new() 
    where TView : new() 
{ 
} 

Dopo qualche minuto ho trovato il problema era con il mio tipo di ritorno TPresenter<Tview>

Ho letto alcuni post che non spiegavano chiaramente Perché non sono in grado di dire T1<T2>

Sono stato costretto a eseguire l'assegnazione del relatore tramite il parametro di riferimento. Qualsiasi spiegazione è ben accetta!

+3

Perché non restituire solo 'TPresenter'? È già vincolato a un tipo che impone la specializzazione a 'TView' (tramite' BasePresenter <> '). –

+0

speravo di evitare un cast dal lato del chiamante! supponendo che potrei raggiungere T1 ! sebbene avrei potuto decidere con il tipo di ritorno di Presenter inizialmente non ero davvero convinto del perché T1 con tutte le condizioni menzionate sopra non può aiutare a convalidare la convalida del tempo. – ioWint

risposta

9

Fondamentalmente non c'è modo di dire che è un parametro di tipo un tipo generico con un determinato numero di parametri di tipo - che è necessario essere in grado di fare in modo da rendere TPresenter<TView> senso.

Non è chiaro cosa intendi facendo funzionare tramite un parametro di riferimento - qualunque tipo tu abbia usato per quel parametro ref dovrebbe andare bene anche come tipo di ritorno. La mia ipotesi è che fosse solo di tipo TPresenter, non TPresenter<TView>.

+0

sì era fuori TPresenter – ioWint

+0

@ioWint: Giusto, quindi basta rendere quello il tipo di ritorno. –

+1

sì, potevo, ho pensato di evitare un cast esplicito dal lato del chiamante. mai infastidito fino ad ora con un T1 , teoricamente speravo che tutte le condizioni dovessero essere fornite dovrebbe essere buono! – ioWint

1

Non esiste una cosa come TPresenter<TView> non ha senso. TPresenter è solo un segnaposto, finché non è vincolato da dove potrebbe essere qualsiasi cosa, ad es. non c'è int<tview> quindi non puoi averlo. Una volta aggiunto il vincolo, significa che deve essere un BasePresenter<TView> o un tipo derivato, quindi sarà sempre un Something<TView>, quindi ancora TPresenter<TView> non ha senso.

+0

ho capito che potrei ingannare int ma devo specificare i miei vincoli che TPresenter è di BasePresenter e TInterface è di classe.questo non sarà sufficiente per garantire che le cose vadano bene @ tempo di compilazione? – ioWint

+1

Il punto è il vincolo dice che TPresenter deve essere BasePresenter o qualcosa che ne derivano in modo che il tipo di ritorno è solo TPresenter –

0

Questo è vecchio, ma l'ho colpito anche io. Nella definizione della classe, basta usare il singolo tipo, quindi più tipi in cui lo si utilizza. E.g:

public class Template1<T>{} 

void SomeFunc() 
{ 
    <Template1<SomeClass1,SomeClass2>> someValue = new <Template1<SomeClass1,SomeClass2>>() 
} 

//or even: 
void SomeOtherFunc<U,V>() 
{ 
    <Template1<U,V>> someValue = new <Template1<U,V>>(); 
} 
0

Stavo ricevendo errore simile nel mio codice. @Jon Skeet punta correttamente nella giusta direzione. Il tipo di reso è già generico, come specificato da TPresenter : BasePresenter<TView>. Quindi possiamo semplicemente usarlo come TPresenter invece di TPresenter<TView>.

public class BasePresenter<T> 
{ 

} 

public class Demo 
{ 
    public static TPresenter Initialize<TPresenter, TView>() where TPresenter: BasePresenter<TView>, new() 
    { 
     return null; 
    } 
} 
Problemi correlati