【问题标题】:invalid cast exception on int to doubleint 上的无效强制转换异常加倍
【发布时间】:2012-09-20 18:07:35
【问题描述】:

也许我疯了,但我认为这是一个有效的演员表:

(new int[]{1,2,3,4,5}).Cast<double>()

为什么 LinqPad 会抛出一个

InvalidCastException:指定的强制转换无效。

?

【问题讨论】:

标签: c# linq casting linqpad


【解决方案1】:

C# 允许从int 直接转换为double,但不能从int 转换为objectdouble

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 =&gt; (double)i) 来获取值转换行为。

【讨论】:

  • 另一种思考方式是 C# 强制转换运算符(方括号)同时执行显式类型强制(int -> double)和类型转换(检查从一种类型到另一种兼容引用的引用转换)。但 Linq 的 Cast 方法只做后者。
  • @OliverBock 这是一种有效的思考方式,但老实说,我认为您在命名强制转换的两种含义之间所做的区分并不被广泛接受。
  • 糟糕!但我想知道为什么value types 失败了。如果是两个reference type 变量的情况,其中两种类型中的一种可以转换为另一种,那么这不会失败。我想知道当 CTS 中的每种类型都继承自 System.Object 时,为什么 C# 只为 value types 以这种方式实现它?
  • 有趣的是,这段代码object obj = 2; double d1 = (double)i; // okay 没有给出错误。我敢肯定,在分配给obj 时,运行时必须将 2 隐式视为整数。
  • @RBT (double)i 可能不会出错,但(double)obj 应该。
猜你喜欢
  • 1970-01-01
  • 2012-02-20
  • 1970-01-01
  • 2012-09-21
  • 1970-01-01
  • 2012-05-28
  • 2015-01-27
  • 2013-11-06
  • 1970-01-01
相关资源
最近更新 更多