You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

.NET中int转double转换抛出InvalidCastException异常求助

问题原因分析与解决方法

核心原因

问题出在三元运算符的类型推断逻辑和装箱值类型的拆箱规则上:

  1. 三元表达式true ? 0 : o中,0是int类型,o是object类型,C#会将整个表达式的返回类型推断为两者的最佳公共类型——object。所以这个表达式的结果是一个装箱后的Int32对象(把int值0包装成了object)。
  2. C#规定,装箱的数值类型只能直接拆箱为它原本的类型,不能直接跨类型强制转换。比如装箱的Int32不能直接用(double)转换,必须先拆箱成int,再转成double,否则就会抛出InvalidCastException。

而你把0改成0.0时,三元表达式的返回类型是装箱后的Double对象,用(double)拆箱是合法操作,所以不会报错。即使给o赋值为int 0,三元表达式的返回类型依然是object(装箱Int32),转换逻辑没变,所以还是会报错。

解决方法

可以用以下几种方式修复:

  • 先拆箱为int,再转换为double:
static void Main(string[] args)
{
    object? o = null;
    double d = (double)(int)(true ? 0 : o);
    Console.WriteLine($"Hello, World! 'd' is {d:0.00}");
}
  • 显式指定第一个分支为double类型,让三元表达式返回装箱Double:
static void Main(string[] args)
{
    object? o = null;
    double d = (double)(true ? (double)0 : o);
    Console.WriteLine($"Hello, World! 'd' is {d:0.00}");
}
  • 使用Convert.ToDouble方法自动处理装箱类型转换:
static void Main(string[] args)
{
    object? o = null;
    double d = Convert.ToDouble(true ? 0 : o);
    Console.WriteLine($"Hello, World! 'd' is {d:0.00}");
}

内容的提问来源于stack exchange,提问作者ZentiumX

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.04 19:42:49