代码之家  ›  专栏  ›  技术社区  ›  pithhelmet

在.net中,“o”的值是什么?为什么?

  •  -2
  • pithhelmet  · 技术社区  · 10 年前

    在.NET中,“o”的值是什么?为什么?

    object o = 3/2;
    

    我的想法是,对象的默认类型是值适合的最低类型,因此答案适合的最小/最低/最小对象是 整数32 ,则这就是设置为基类的内容。

    这看起来对吗?

    3 回复  |  直到 10 年前
        1
  •  9
  •   Sergey Berezovskiy    10 年前

    这就是所谓的 整数除法 看见 / Operator (C# Reference) :

    当你除以两个整数时,结果总是一个整数。对于 例如,7/3的结果是2。

    还有C#规范 7.7.2 Division operator :

    整数除法:

    除法将结果舍入为零 结果是小于 两个操作数的商的绝对值。结果为零 当两个操作数具有相同的符号和零或 当两个操作数具有相反符号时为负值。

    所以,舍入结果为零 1 对于 3/2 。如果要获取浮点数,则应使用 浮点数 除法(即至少一个操作数应为浮点值):

    object o = 3F/2; // 1.5
    
        2
  •  4
  •   n8wrl    10 年前

    “默认情况下”是将两个int32除以,因为这就是计算常数的方式。结果是int32 1。

    “o”然后变为表示1的“盒装int32”。

        3
  •  1
  •   Nicholas Carey    10 年前

    编译器看到常量(不变)表达式 3/2 并执行 恒定折叠 :在编译期间计算常量表达式,结果用于替换常量表达式。编译器从

    object o = 3/2 ;
    

    至:

    object o = 1 ;
    

    既然你在提升整数 1 object 从…起 struct ,它被装箱了。

    应该注意,其他类型的常量表达式也会发生同样的情况:

    string s = "a" + "b" + "c" ;
    

    应用相同的恒定折叠变换,变为:

    string s = "abc" ;