.NET中int转double转换抛出InvalidCastException异常求助
问题原因分析与解决方法
核心原因
问题出在三元运算符的类型推断逻辑和装箱值类型的拆箱规则上:
- 三元表达式
true ? 0 : o中,0是int类型,o是object类型,C#会将整个表达式的返回类型推断为两者的最佳公共类型——object。所以这个表达式的结果是一个装箱后的Int32对象(把int值0包装成了object)。 - 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
相关产品推荐
相关产品推荐

