我正在读一本通过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有什么区别吗?你有什么看法?
答案 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
因此,你可以看到,先施放浮动,会产生不同的结果。 请记住,这些都是边缘情况,很可能是学术问题。