invalid cast exception on int to double
也许我疯了,但我认为这是一个有效的演员阵容:
1
| (new int[]{1, 2, 3, 4, 5}).Cast<double>() |
为什么 LinqPad 会抛出一个
InvalidCastException: Specified cast is not valid.
?
- 另请参阅Why-cant-i-unbox-an-int-as-a-decimal。关系很密切。。
C# 允许从 int 直接转换到 double,但不能从 int 到 object 到 double。
1 2 3 4
| int i = 1;
object o = i;
double d1 = (double)i; // okay
double d2 = (double)o; // error |
Enumerable.Cast 扩展方法的行为类似于后者。它不会将值转换为不同的类型,它会断言值已经是预期的类型,如果不是则抛出异常。
您可以尝试 (new int[]{1,2,3,4,5}).Select(i => (double)i) 来获得值转换行为。
- 另一种思考方式是 C# 强制转换运算符(方括号)同时执行显式类型强制(int -> double)和类型转换(检查从一种类型到另一种兼容引用的引用转换)。但 Linqs Cast 方法只做后者。
-
@OliverBock 这是一种有效的思考方式,但老实说,我认为您在命名演员表的两种含义之间所做的区分并不被广泛接受。
-
哎呀!但我想知道为什么 value types 会失败。如果是两个 reference type 变量的情况,其中两种类型中的一种可以转换为另一种,那么这不会失败。我想知道当 CTS 中的每种类型都继承自 System.Object 时,为什么 C# 只为 value types 以这种方式实现它?
-
有趣的是,这段代码 object obj = 2; double d1 = (double)i; okay 没有给出错误。我确定这里 2 在分配给 obj 时必须被运行时隐式视为整数。
-
@RBT (double)i 可能不会出错,但 (double)obj 应该。