【问题标题】:How to conversion of a boxed double type to int value type?如何将装箱的 double 类型转换为 int 值类型?
【发布时间】:2017-10-29 11:41:51
【问题描述】:

我正在阅读一本书以通过 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有什么区别吗?你有什么意见?

【问题讨论】:

  • 这本书是 The C# Programmer's Study Guide (MCSD)。考试:70-483。作者:阿萨德、阿里、阿里、哈姆扎
  • 好吧,A 会失败(“指定的强制转换无效。”),D 也会失败(“不能将类型 'float' 隐式转换为 'int'。”)所以你唯一的选择是B 和 C。他们之间,我真的看不出有什么区别。
  • 我认为这是由于自定义指令序列。欲了解更多信息,请访问以下链接:https://ericlippert.com/2009/03/03/representation-and-identity/

标签: c# type-conversion


【解决方案1】:

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

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

选项 B:完全没问题。 o 将在 double 中拆箱。之后它将在integer 中强制转换(显式)。

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

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

那么为什么是 C? 在某些情况下,将 double 舍入为 int 与将 float 舍入为 int 不同。 从supercat看下面的answer

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

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

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

【讨论】:

  • 感谢您的详细解释。尽管问题有问题,但我可以看到两个选项之间的区别。
  • 如果有解释为什么这是首选答案,那就太好了。特别是当有2个非常相似的案例时。就像上面的例子一样,就可理解性而言,12344322 是否比 12344321 “更好”的结果是有争议的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-02-08
  • 2020-12-13
  • 2019-08-18
  • 2020-05-03
  • 2016-03-12
  • 1970-01-01
相关资源
最近更新 更多