如何将盒装双精度型转换为int值类型?

时间:2017-10-29 11:41:52

标签: c# type-conversion

我正在读一本通过Microsoft考试70-483的书,我对以下问题有点疑惑:

以下代码装入对象o。

double d = 11.5;
object o = d;

您被要求将对象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

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

1 个答案:

答案 0 :(得分:1)

在您给出的示例中,选项B完全正常。

选项A:您无法打包和取消包装不同的类型。这将产生InvalidCastExpression

选项B:完全没问题。 o中的double将被取消装箱。之后,它将在integer中投射(显式)。

选项C:与B类似,但在将其转换为整数之前,它将被转换为浮点数。结果将保持不变。绝对不需要从双重到漂浮的演员阵容。它总是会被截断。 但有边缘情况! (见下文)

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

那么为什么是C? 有些情况下,将double舍入为int与将float舍入为int不同。 请参阅answer

中的以下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();
}

输出将是:

12344322
12344321

因此,你可以看到,先施放浮动,会产生不同的结果。 请记住,这些都是边缘情况,很可能是学术问题。