C# 无法理解Type.IsAssignableFrom
为什么C# 无法理解Type.IsAssignableFrom,c#,types,C#,Types,为什么canAssign为false?当您将int分配给long时,只会发生隐式转换longOne是一个实际的long(好像您将它初始化为1L),而不是一个伪装成long的int,如果您得到了漂移的话 也就是说,int(或Int32)和long(或Int64)在继承或实现方面不相关;它们恰好是可转换的,因为它们都是整数类型。查看Reflector中的方法,该方法似乎是用于确定继承性而不是兼容性 例如,如果您有一个实现接口的类,那么如果您实现了接口,那么该方法将返回true (typeof(int
canAssign
为false?当您将int
分配给long
时,只会发生隐式转换longOne
是一个实际的long
(好像您将它初始化为1L
),而不是一个伪装成long
的int
,如果您得到了漂移的话
也就是说,
int
(或Int32
)和long
(或Int64
)在继承或实现方面不相关;它们恰好是可转换的,因为它们都是整数类型。查看Reflector中的方法,该方法似乎是用于确定继承性而不是兼容性
例如,如果您有一个实现接口的类,那么如果您实现了接口,那么该方法将返回true
(typeof(interface).IsAssignableFrom(typeof(class))
From:
如果c和当前类型表示相同的类型,或者如果当前类型在c的继承层次结构中,或者如果当前类型是c实现的接口,或者如果c是泛型类型参数,并且当前类型表示c的一个约束,则为true。如果这些条件都不为true,或者如果c为null,则为false
正如@BoltClock所说,这只是隐式转换。如果类型相同,或者如果类型实现或继承了它,
IsAssignableFrom
将返回true
long
不会继承int
,因此该方法返回false
当您将
int
值赋给long
时,它不仅仅是一个赋值。编译器还会自动添加代码,将int
值转换为long
值。因为Type.IsAssignableFrom是一个.NET框架工具,而将int赋给long则是一个C语言工具在生成的IL中,您将看到类型转换指令。在许多地方,CLR规则可能与C#规则不同,另一个例子是MethodBase.Invoke中的重载解析和C#编译器执行的重载解析。这一个总是让我困惑。我总是忘记检查哪种方式(基到子或子到基).IsAssignableFrom(otherType)var isSameOrChild=baseType.IsAssignableFrom(otherType)
int i=1;
long longOne=i; //assignment works fine
//...but
bool canAssign=(typeof(long).IsAssignableFrom(typeof(int))); //false