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