整型转换为双精度浮点型时出现无效转换异常

27

也许我有点疯狂,但我认为这是一个有效的转换:

(new int[]{1,2,3,4,5}).Cast<double>()
为什么 LinqPad 会抛出 InvalidCastException: Specified cast is not valid. 异常?

还可以参见为什么我不能将int解包为十进制数。非常相关的内容。 - nawfal
1个回答

40

C# 允许直接将 int 转换为 double,但不允许从 int 转换为 object 再转换为 double

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),也可以进行类型转换(从一种兼容引用类型到另一种引用类型的检查转换)。但是Linq的Cast方法只能执行后者。 - Oliver Bock
@OliverBock 这是一种有效的思考方式,但说实话,我不认为你所做出的区分命名两个转换含义被广泛接受。 - user743382
糟糕!但我在想为什么它对“值类型”失败了。如果是两个“引用类型”变量的情况,其中一个类型可以转换为另一个类型,那么这种情况就不会失败。我在想为什么C#在每种类型都从“System.Object”继承的情况下,只针对“值类型”实现了这种方式? - RBT
有趣的是,这段代码 object obj = 2; double d1 = (double)i; // okay 没有报错。我相信在将2分配给obj时,运行时会隐式地将其视为整数。 - RBT
1
@RBT (double)i 可能不会出错,但是 (double)obj 应该会。 - user743382

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接