【发布时间】:2012-09-20 18:07:35
【问题描述】:
也许我疯了,但我认为这是一个有效的演员表:
(new int[]{1,2,3,4,5}).Cast<double>()
为什么 LinqPad 会抛出一个
InvalidCastException:指定的强制转换无效。
?
【问题讨论】:
-
另见why-cant-i-unbox-an-int-as-a-decimal。密切相关..
也许我疯了,但我认为这是一个有效的演员表:
(new int[]{1,2,3,4,5}).Cast<double>()
为什么 LinqPad 会抛出一个
InvalidCastException:指定的强制转换无效。
?
【问题讨论】:
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) 来获取值转换行为。
【讨论】:
value types 失败了。如果是两个reference type 变量的情况,其中两种类型中的一种可以转换为另一种,那么这不会失败。我想知道当 CTS 中的每种类型都继承自 System.Object 时,为什么 C# 只为 value types 以这种方式实现它?
object obj = 2; double d1 = (double)i; // okay 没有给出错误。我敢肯定,在分配给obj 时,运行时必须将 2 隐式视为整数。
(double)i 可能不会出错,但(double)obj 应该。