为什么IsAssignableFrom()不适用于int和double

本文关键字:int double 适用于 不适用 IsAssignableFrom 为什么 | 更新日期: 2023-09-27 17:58:50

这是错误的:typeof(double).IsAssignableFrom(typeof(int))

这是错误的:typeof(int).IsAssignableFrom(typeof(double))

但这是有效的:

double a = 1.0;
int b = 1;
a = b;

显然,double是可从int分配的,但框架IsAssignableFrom()弄错了。

为什么?或者这是.NET中的一个错误,是由intdouble的特殊性质引起的,它们没有继承关系,但可以(在一个方向上)赋值?

为什么IsAssignableFrom()不适用于int和double

C#提供了从intdouble的隐式转换。这是语言的决定,而不是.NET将为您做的事情。。。因此,从.NET的角度来看,double不可从int赋值。

(作为为什么这是特定于语言的一个例子,F#不会像这样为您执行隐式转换-您需要显式指定转换。)

值得一看的是Type.IsAssignableFrom的文档(为了可读性,稍微编辑了一下):

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

现在将其应用于doubleint,您会看到应该返回false。