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

Ian*_*cer 25 .net c# types

这是假的: typeof(double).IsAssignableFrom(typeof(int))

这是假的: typeof(int).IsAssignableFrom(typeof(double))

但这有效:

        double a = 1.0;
        int b = 1;

        a = b;
Run Code Online (Sandbox Code Playgroud)

很明显,a double 可以从a 分配,int但框架IsAssignableFrom()会出错.

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

Jon*_*eet 23

C#从提供隐式转换intdouble.这是一个语言决定,而不是.NET会为你做的事情......所以从.NET的角度来看,double 不能从中分配int.

(作为为什么这是特定于语言的示例,F#不会像这样执行隐式转换 - 您需要明确指定转换.)

值得查看文档Type.IsAssignableFrom(为了便于阅读而略微编辑):

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

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

  • @Hightechrider:这是一个方法调用(而不是任何特定于语言的命名空间),因此它显然是一个框架功能. (5认同)
  • `IsAssignableFrom()` 是语言特性还是框架特性?如果它是一种语言特性,为什么它不做它的名字所说的那样呢?是的,如果您阅读 MSDN 上的小字,它实际上从未说过它会检查可分配性,但该名称会误导人们认为它应该这样做。 (2认同)