C# int-或object-to-double转换错误解释

问题描述 投票:0回答:5

以下代码在最后一次分配时失败:

static void Main(string[] args)
{
    int a = 5;
    object b = 5;

    System.Diagnostics.Debug.Assert( a is int && b is int );

    double x = (double)a;
    double y = (double)b;
}

如果a和b都是

int
,这个错误的原因是什么?

c# casting int double
5个回答
25
投票

这是一个非常常见的问题。请参阅 https://ericlippert.com/2009/03/03/representation-and-identity/ 获取解释。


片段:

我收到了很多关于 C# 强制转换运算符的问题。我最常收到的问题是:

short sss = 123;
object ooo = sss;            // Box the short.
int iii = (int) sss;         // Perfectly legal.
int jjj = (int) (short) ooo; // Perfectly legal
int kkk = (int) ooo;         // Invalid cast exception?! Why?

为什么?因为装箱的

T
只能拆箱为
T
。 (*) 一旦拆箱,它只是一个可以像往常一样进行转换的值,因此双重转换工作得很好。

(*) 或

Nullable<T>


17
投票

拆箱需要确切的类型 - 您可以这样做:

double y = (double)(int)b;

7
投票

这是

System.Convert
派上用场的罕见情况之一。如果您事先不知道它会是
System.Convert.ToDouble(obj)
,您可以使用
int
将其敲掉。


3
投票

隐式转换是编译时操作。对于

b
类型的
object
来说这是不可能的。


0
投票

a
是一个
int
,但
b
是对
int
对象的引用 - 这就是所谓的装箱 int。它们是两个不同的东西,因此有不同的行为。

© www.soinside.com 2019 - 2024. All rights reserved.