2011-07-31 11 views
5

Quiero comprobar si un tipo admite IComparable antes de ordenarlo, pero he encontrado que comprobar si un tipo admite la interfaz IComparable con "es" no siempre me da la respuesta correcta. Por ejemplo, typeof(int) is IComparable devuelve falso, aunque int admite la interfaz IComparable.¿Cómo puedo usar "es" para probar si un tipo admite IComparable?

Noté que typeof(int).GetInterfaces() enumera IComparable y typeof(int).GetInterface("IComparable") devuelve el tipo IComparable, entonces ¿por qué "no funciona" como esperaba?

+0

Las especificaciones 'is' dicen que devuelve verdadero cuando la conversión no lanza una excepción. intente convertir un 'int' en' IComparable' y vea si hay algún problema. – Dani

Respuesta

10

is obras en una instancia. Cuando dice typeof(int) is IComparable, entonces lo que realmente está comprobando es si el tipo System.Type implementa IComparable, que no es así. Para utilizar is, debe utilizar una instancia:

bool intIsComparable = 0 is IComparable; // true 
5

El int ¿Apoya IComparable pero el tipo de int no lo hace, es decir, usted debe comprobar la propia variable no su Type, por lo que:

int foo = 5; 
foo is IComparable;//the result is true, but of course it will not be true if you check typeof(foo) 
2

El operador is espera una instancia en el lado izquierdo:

int i = 1; 
if (i is IComparable) ... 

Compila (con una advertencia acerca de ser siempre verdad).

Y "typeof(int) is IComparable vuelve falsa"

Eso es porque usted está preguntando si (una instancia de) la clase de tipo es IComparable. No lo es.

Cuestiones relacionadas