2010-01-29 23 views
6

Aquí está mi códigointerfaces genéricas

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 
} 

Cuando compilo esto, me sale un error Type parameter declaration must be an identifier not a type

¿Por qué es que no puedo tener ToEntity<MyOtherClass>, pero sólo puede tener ToEntity<T> ??

Edit: ¿Qué está haciendo MyOtherClass? Estoy convirtiendo entre entidades (equivalentes de POCO del marco de la Entidad) y registro (Objeto devuelto por el marco) para múltiples tablas/clases. Así que me gustaría usar esto para hacer mi conversión específica de clase

+2

@Ram, necesita decirnos: ¿cómo se supone que 'MyOtherClass' está involucrado en su método' Gens.ToEntity'? Del código no está nada claro. Si supiéramos su intención detrás de esto, probablemente podríamos ofrecer algunos comentarios más útiles. –

Respuesta

9

Su interfaz tiene un método genérico ToEntity<T> que ha hecho no genérico en su clase de implementación Gens como ToEntity<MyOtherClass>. (A genérica método podría tomar cualquier tipo de parámetro, posiblemente dado ciertas limitaciones en T. Su clase Gens está tratando de proporcionar una definición para ToEntitysólo para el parámetro de tipo MyOtherClass, lo que contradice el objetivo de los genéricos.)

En el ejemplo de su código, no está claro cómo su clase Gens está tratando de usar el tipo MyOtherClass; ciertamente no está involucrado en la lógica de ToEntity. Necesitaríamos más información para poder guiarlo más.

Para ilustrar, aquí está lo que su definición actual de los ITranslator<E, R> ofertas de interfaz, en la llanura Inglés:

"Me proporciona un mecanismo para traducir ningún registro de tipo R en una entidad de tipo E, este mecanismo es dependiendo de cualquier tipo especificado por el usuario T. "

Su Gens clase, por otro lado, la forma en que está diseñado actualmente, "implementa" la interfaz anterior, así:.

"Puedo traducir los números enteros a cadenas que proporcionan la ilusión de permitir al usuario especificar un tipo de controlar cómo se realiza esta traducción, pero , de hecho, no hay elección del tipo de la clase MyOtherClass está implicado de alguna manera ;. eso es todo Puedo decir."

A partir de estas dos descripciones, está claro que la clase Gens no está haciendo realmente lo que garantiza la interfaz ITranslator<E, R>.A saber, no está dispuesto a aceptar un tipo especificado por el usuario para su método ToEntity. Es por eso que este código no compilará para usted.

+1

muy buena respuesta lúcida. La clase no implementa la interfaz en su verdadero espíritu. De ahí el error – ram

1

Eso compila OK para mí en LINQpad. ¿Tal vez tienes un tipo llamado E, R o T en alguna parte?

Ahh Veo lo que estás tratando de hacer ... tienes MyOtherClass definido como una clase en alguna parte pero estás tratando de usarlo como argumento de tipo en ToEntity. ¿Cómo exactamente quieres que MyOtherClass participe en ToEntity?

+0

falla en vs2008 – ram

+2

Ese código en sí mismo que pegó es en realidad código válido y compila bien. No estoy seguro de qué es lo que pretendes hacer con MyOtherClass en tu ejemplo. – Josh

2

Debe declarar una restricción en un tipo genérico.

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