2011-06-08 10 views
24

Esto es falso: typeof(double).IsAssignableFrom(typeof(int))¿Por qué IsAssignableFrom() no funciona para int y double?

Esto es falso: typeof(int).IsAssignableFrom(typeof(double))

Pero esto funciona:

 double a = 1.0; 
     int b = 1; 

     a = b; 

Es evidente que un doublees asignable a partir de una int pero el marco IsAssignableFrom() se equivoca.

¿Por qué? ¿O es esto un error en .NET causado por la naturaleza especial de int y el doble que no tienen relación de herencia, pero que son asignables (en una dirección)?

+1

Supongo que no tiene en cuenta la conversión implícita. –

+0

Desde la página [IsAssignableFrom MSDN] (http://msdn.microsoft.com/en-us/library/system.type.isassignablefrom.aspx): Devuelve "verdadero si c y el Tipo actual representan el mismo tipo, o si el Tipo actual está en la jerarquía de herencia de c, o si el Tipo actual es una interfaz que c implementa, o si c es un parámetro de tipo genérico y el Tipo actual representa una de las restricciones de C. falso si ninguno de estos las condiciones son verdaderas, o si c es una referencia nula ". – bentayloruk

+0

Gracias a todos; Agregué una nota de comunidad a MSDN, haciendo que este corolario oculto sea algo más claro, para que nadie más suponga tontamente que el nombre del método significa lo que dice. Supongo que 'Type.IsSomewhatAssignableFrom' hubiera sido demasiado largo :) –

Respuesta

22

C# proporciona la conversión implícita de int a double. Esa es una decisión de idioma, no algo que .NET hará por usted ... así que desde el punto de vista .NET, doubleno es asignable desde int.

(Como un ejemplo de por qué esto es específico del idioma, F # no realizar conversiones implícitas para usted como esto - que había necesidad de especificar explícitamente la conversión.)

Vale la pena mirar el documentación para Type.IsAssignableFrom (editado ligeramente para facilitar la lectura):

devuelve verdadero si c y el tipo de corriente representan el mismo tipo, o si el tipo actual está en la jerarquía de herencia de C, o si el tipo actual es una interfaz que c implementa, o si c es un parámetro de tipo genérico y el tipo actual repr es una de las limitaciones de c. Devuelve falso si ninguna de estas condiciones es verdadera, o si c es nulo.

Ahora que se aplican a double y int y verás que debe devolver false.

+1

¿' IsAssignableFrom() 'es una función de idioma o una función de marco? Si se trata de una función de idioma, ¿por qué no haría lo que dice su nombre? Sí, si lees la letra pequeña en MSDN, en realidad nunca dice que verifica la asignación, pero el nombre lo lleva a pensar que debería hacerlo. –

+5

@Hightechrider: Es una llamada a método (y no dentro de ningún tipo de espacio de nombre específico del idioma), por lo que es claramente una función de marco. –

Cuestiones relacionadas