2010-05-27 12 views
8

Ahora que tenemos covarianza y contravarianza genéricas en las interfaces y delegados en C#, me llamó la atención si se le da un Type, puede deducir la covarianza/contravarianza de sus argumentos genéricos. Empecé a tratar de escribir mi propia implementación, que examinaría todos los métodos de un tipo determinado y vería si los tipos de retorno y los argumentos coinciden con los tipos en los argumentos genéricos. El problema es que incluso si tengo esto:¿Hay alguna forma de determinar la varianza de una interfaz/delegado en C# 4.0?

public interface IFoo<T> 
{ 
    void DoSomething(T item); 
} 

usando mi lógica, parece que debería ser contravariant, pero ya que no llegó a especificar:

public interface IFoo<in T> 
{ 
    void DoSomething(T item); 
} 

(el parámetro) en realidad no es contravariante. Lo que lleva a mi pregunta: ¿hay alguna forma de determinar la varianza de los parámetros genéricos?

+0

¿por qué necesitarías eso? –

+0

@ Mitch Te lo haré saber cuando me dé cuenta :) Solo estaba preguntando por curiosidad ... – BFree

Respuesta

5

No sé por qué querrías esto, PERO puedes mirarlo con reflejo desde fuera del tipo. Aquí hay información sobre mirando parámetros genéricos para un tipo utilizando la reflexión:

http://msdn.microsoft.com/en-us/library/b8ytshk6.aspx

En concreto, los Type.GenericParameterAttributes de propiedad sobre el tipo regrese de una llamada a Type.GetGenericParameters revelarán las propiedades de Co/contravarianza de el argumento genérico ... se trata de una enumeración bit a bit que revelará la combinación de esta información:

http://msdn.microsoft.com/en-us/library/system.reflection.genericparameterattributes.aspx

realmente interesante ... gracias por preguntar esto y me hace mirar hacia arriba.

+1

Exactamente lo que estaba buscando. Otra cosa interesante es que, si miras ese segundo enlace, dice que es compatible desde .Net 2.0. Supongo que siempre ha estado ahí, ya que otros lenguajes han estado soportando Covarianza/Contravarianza por un tiempo (creo ...). Nunca noté que ... – BFree

+0

@BFree: observación interesante. Tendré que dejar eso para más adelante investigarlo. –

Cuestiones relacionadas