不了解Type.IsAssignableFrom

时间:2011-01-24 11:09:28

标签: c# types

int i=1;
long longOne=i; //assignment works fine
//...but
bool canAssign=(typeof(long).IsAssignableFrom(typeof(int))); //false

为什么canAssign为假?

5 个答案:

答案 0 :(得分:19)

查看Reflector中的方法,看起来这个方法用于确定继承而不是兼容性。

例如,如果您有一个实现接口的类,那么如果您这样做,该方法将返回true (typeof(interface).IsAssignableFrom(typeof(class))

答案 1 :(得分:11)

int分配给long时,所有相关内容都是隐式转换。 longOne是实际的long(如果您将其初始化为1L),而不是int伪装成long,如果您获得了漂移

即,int(或Int32)和long(或Int64)在继承或实施方面无关;它们恰好是可转换的,因为它们都是整数类型。

答案 2 :(得分:3)

如果类型相同,或者类型实现或继承它,IsAssignableFrom将返回true。

long不会继承int,因此该方法返回false。

当您为int分配long值时,它不仅仅是一项任务。编译器还会自动添加代码以将int值转换为long值。

答案 3 :(得分:3)

因为Type.IsAssignableFrom是一个.NET框架工具,所以从int到long的分配是一个C#语言。如果你看一下生成的IL,你会看到那里的类型转换指令。 CLR规则可能与C#规则有很多不同的地方,另一个例子是MethodBase.Invoke中的重载解析和C#编译器执行的规则。

答案 4 :(得分:2)

来自http://msdn.microsoft.com/en-us/library/system.type.isassignablefrom.aspx

  

如果c和当前Type表示相同的类型,或者当前Type在c的继承层次结构中,或者当前Type是c实现的接口,或者c是泛型类型参数且是current Type表示c的约束之一。如果这些条件均不为真,或者c为空,则返回false。

正如@BoltClock所说它只是隐式转换。