Domanda

Ecco il mio codice

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: che cosa sta facendo MyOtherClass? Io sono la conversione tra le entità (pocos equivalente di Entity Framework) e registrare (oggetto restituito dal quadro) per più tabelle / classi. Quindi vorrei usare questo per fare la mia conversione specifica classe

È stato utile?

Soluzione

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

Nel tuo esempio di codice, non è chiaro come la classe Gens sta cercando di utilizzare il tipo di MyOtherClass; Non è certamente coinvolto nella logica del ToEntity. Avremmo bisogno di più informazioni per essere in grado di guidare l'utente ulteriormente.

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

  

"Io fornisco un meccanismo di tradurre   qualsiasi atto di tipo R in un'entità   di tipo E, questo meccanismo essendo   dipende da alcun tipo specificato dall'utente   T ".

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

  

"posso tradurre interi in stringhe.   Fornisco il illusione di permettere   all'utente di specificare un tipo di controllo   come viene eseguita questa traduzione, ma   in realtà non c'è nessuna scelta di tipo.   La classe MyOtherClass è coinvolto   in qualche modo; questo è tutto quello che posso dire. "

Da queste due descrizioni, è chiaro che la classe Gens non è realmente facendo quello che le garanzie di interfaccia ITranslator<E, R> . Vale a dire, non è disposto ad accettare un tipo specificato dall'utente per il suo metodo di ToEntity. Ecco perché il codice non viene compilato per voi.

Altri suggerimenti

Si deve dichiarare un vincolo su un tipo generico.

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

che compila bene per me in LINQPad. Forse avete un tipo di nome E, R, T o da qualche parte?

Ahh vedo quello che stai cercando di fare ... avete MyOtherClass definito come un posto di classe ma si sta cercando di usarlo come un argomento di tipo in ToEntity. Esattamente come si desidera MyOtherClass coinvolto in ToEntity?

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top