如何将盒装 double 类型转换为 int 值类型?

Tou*_*reg 4 c# type-conversion

我正在阅读一本书以通过 Microsoft 考试 70-483,但我在以下问题上有点卡住了:

下面的代码被装箱到对象 o 中。

double d = 11.5;
object o = d;
Run Code Online (Sandbox Code Playgroud)

您需要将 object o 转换为 int。您应该在代码中使用什么选项?

int i = (int)o; //Option : A
int i = (int)(double)o;     //Option : B
int i = (int)(float)(double)o; //Option : C
int i = (float)o;     //Option : D
Run Code Online (Sandbox Code Playgroud)

根据书,真正的答案是 C,但我不明白为什么选项 b 是错误的。当我尝试运行它们时,结果是一样的。选项B和选项C有什么区别吗?你有什么意见?

Lin*_*ink 5

在您给出的示例中,选项 B 完全没问题。

选项 A:您不能装箱和拆箱不同的类型。这将导致InvalidCastException.

选项B:完全没问题。o将在一个double. 之后它将被转换(显式)在一个integer.

选项 C:与 B 一样,但在将其转换为整数之前,将转换为浮点数。结果将保持不变。绝对不需要从 double 到 float 的转换。它总是会截断。但也有边缘情况!(见下文)

选项 D:不能使用从 float 到 int 的隐式转换。与 A 相同:InvalidCastException

那为什么是C?在某些情况下,将 double 舍入为 int 与将 float 舍入为 int 不同。请参阅下面的答案supercat

您可以通过以下示例重现这一点:

static void Main(string[] args)
{
    double val = 12344321.4999999991;
    int a = (int)(float)val;
    int b = (int)val;

    Console.WriteLine(a);
    Console.WriteLine(b);
    Console.ReadLine();
}
Run Code Online (Sandbox Code Playgroud)

输出将是:

12344322
12344321
Run Code Online (Sandbox Code Playgroud)

如您所见,首先转换为浮动会导致不同的结果。请记住,这些都是边缘情况,很可能是学术问题。