int i=1;
long longOne=i; //assignment works fine
//...but
bool canAssign=(typeof(long).IsAssignableFrom(typeof(int))); //false
为什么canAssign
为假?
答案 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所说它只是隐式转换。