2010-01-29 18 views
6

Ecco il mio codiceinterfacce generiche

public interface ITranslator<E, R> 
{  
    E ToEntity<T>(R record); 
} 

class Gens : ITranslator<string, int> 
{ 
    #region ITranslator<string,int> Members 

    public string ToEntity<MyOtherClass>(int record) 
    { 
     return record.ToString(); 
    } 

    #endregion 
} 

Quando compilo questo, ottengo un errore Type parameter declaration must be an identifier not a type

Perché è che non posso avere ToEntity<MyOtherClass> ma può avere solo ToEntity<T> ??

Modifica: cosa fa MyOtherClass? Sto convertendo tra entità (equivalente POCO di Entity framework) e record (oggetto restituito dal framework) per più tabelle/classi. Quindi vorrei usare questo per fare la mia conversione specifica di classe

+2

@Ram, è necessario dirci: come si suppone che 'MyOtherClass' sia coinvolto nel metodo' Gens.ToEntity'? Dal codice non è affatto chiaro. Se conoscessimo le tue intenzioni, potremmo probabilmente offrire qualche feedback più utile. –

risposta

9

L'interfaccia ha un metodo generico ToEntity<T> che è stato creato non generico nella classe di implementazione Gens come ToEntity<MyOtherClass>. (Un generico metodo potrebbe prendere qualsiasi parametro tipo, forse dato alcuni vincoli T. La vostra classe Gens sta cercando di fornire una definizione di ToEntitysolo per il parametro di tipo MyOtherClass, che sconfigge lo scopo di farmaci generici.)

Nell'esempio del codice, non è chiaro in che modo la classe Gens sta tentando di utilizzare il tipo MyOtherClass; non è certamente coinvolto nella logica di ToEntity. Avremmo bisogno di più informazioni per poterti guidare ulteriormente.

Per illustrare, ecco cosa il vostro attuale definizione delle ITranslator<E, R> offerte di interfaccia, in parole povere:

"Ho fornisce un meccanismo di tradurre qualsiasi record di tipo R in un'entità di tipo E, questo meccanismo essendo dipende da qualsiasi tipo specificato dall'utente T. "

tuo Gens di classe, d'altra parte, il modo in cui è attualmente progettato, "implementa" l'interfaccia di cui sopra in questo modo:.

"Mi può tradurre interi in stringhe posso fornire il illusione di consentire all'utente di specificare un tipo di controllo come viene eseguita questa traduzione, ma in realtà non c'è scelta di tipo la classe MyOtherClass è coinvolto in qualche modo ;. questo è tutto Posso dire."

Da queste due descrizioni, è chiaro che la classe Gens non è davvero facendo ciò che l'interfaccia ITranslator<E, R> garantisce.Vale a dire, non è disposto ad accettare un tipo specificato dall'utente per il suo metodo ToEntity. Ecco perché questo codice non verrà compilato per te.

+1

molto bella risposta lucida. La classe non implementa l'interfaccia nel suo vero spirito. Quindi l'errore – ram

1

Che compila OK per me in LINQpad. Forse hai un tipo chiamato E, R o T da qualche parte?

Ah, vedo cosa stai cercando di fare ... hai MyOtherClass definito come una classe da qualche parte eppure stai cercando di usarlo come argomento di tipo in ToEntity. Come esattamente vuoi che MyOtherClass sia coinvolto in ToEntity?

+0

non riesce in vs2008 – ram

+2

Quel codice da solo che hai incollato è in realtà codice valido e compila bene. Non sono abbastanza sicuro di cosa intendi fare con MyOtherClass nel tuo esempio. – Josh

2

È necessario dichiarare un vincolo su un tipo generico.

public string ToEntity<T>(int record) where T : MyOtherClass 
Problemi correlati