2011-07-19 17 views
7

Actualmente estoy leyendo sobre covarianza y contravarianza en C#.¿Se aplica la covarianza/contravarianza a tipos implícitamente convertibles que no implementan una interfaz común?

Todos los ejemplos tienen detalles de los objetos que se pueden convertir y difieren debido a la precisión de la implementación de la interfaz, p.

Dónde Circle : IShape

covarianza: SomeType<Circle> as SomeType<IShape>
contravarianza: SomeType<IShape> as SomeType<Circle>


Si TypeA y TypeB tienen cada uno un implicit converter escrita para convertir al otro tipo, pero no lo hacen implementar cualquier interfaz común , sigue siendo correcto hablar de covarianza/contravarianza cuando se trata de la conversión de genéricos de estos e tipos? ¿O es este un concepto diferente?

Respuesta

2

concepto diferente. La covarianza en el sentido out (o la contravariancia a través de in) siempre conserva la referencia, sin transformación en absoluto, solo la misma referencia en otros términos (comprobables). Esta es también la razón por la que no se aplica a las estructuras que implementan una interfaz, ya que una caja no conserva la referencia. La misma lógica de conservación de referencia se aplica a la asignación covariante de matrices de tipos de referencia.

+0

¿Hay un nombre para este concepto? ¿Es otro tipo de varianza genérica? – StuperUser

1

Los tipos no necesitan implementar una interfaz común para ser co/contra variantes.

Los términos simplemente se refieren a si la conversión dará como resultado la pérdida de información o el posible aumento de la información. Esto es tan relevante cuando se aplica a objetos heredados como cuando se aplica a dobles y flotantes.

Así que sí, sigue siendo correcto hablar de co/contra-varianza cuando se habla de objetos que no tienen una interfaz común, siempre y cuando haya un convertidor implícito.

Cuestiones relacionadas