关于 c#:int to double 上的无效强制转换异常 | 珊瑚贝

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 应该。


来源:https://www.codenong.com/12647068/

微信公众号
手机浏览(小程序)

Warning: get_headers(): SSL operation failed with code 1. OpenSSL Error messages: error:14090086:SSL routines:ssl3_get_server_certificate:certificate verify failed in /mydata/web/wwwshanhubei/web/wp-content/themes/shanhuke/single.php on line 57

Warning: get_headers(): Failed to enable crypto in /mydata/web/wwwshanhubei/web/wp-content/themes/shanhuke/single.php on line 57

Warning: get_headers(https://static.shanhubei.com/qrcode/qrcode_viewid_8830.jpg): failed to open stream: operation failed in /mydata/web/wwwshanhubei/web/wp-content/themes/shanhuke/single.php on line 57
0
分享到:
没有账号? 忘记密码?