【问题标题】:Output (Nullable Types in C#)输出(C# 中的可空类型)
【发布时间】:2012-09-17 16:44:45
【问题描述】:

在 c# 中(可空类型)

int a = 10;
int? b = 20;
int? c = null;

System.Console.WriteLine( a+c??b );

输出为:20

如果 (c??b +a) 那么输出是 30

我不明白为什么..

【问题讨论】:

  • 别人已经给出了解释。所以这就是你真正想要的:a+(c??b)(c??b)+a。他们确实同意,因为+ 是可交换的(即使使用可空整数)。

标签: c#


【解决方案1】:

这只是优先级问题。

这个:

System.Console.WriteLine(a + c ?? b);

相当于:

System.Console.WriteLine((a + c) ?? b);

a + c 为空(因为c 为空),因此打印 20(b 的值)

而这个:

System.Console.WriteLine(c ?? b + a);

相当于:

System.Console.WriteLine(c ?? (b + a));

c 为 null,因此计算 RHS (b + a),即 30。

【讨论】:

    【解决方案2】:

    当你写的时候:

      System.Console.WriteLine( a+c??b );
    

    它将有效地评估为:

            int? temp = a + c;
            System.Console.WriteLine(temp ?? b);
    

    上面的“temp”为空,所以你得到b的结果。

    【讨论】:

      【解决方案3】:

      在这里查看:ECMA-334: 14.2.1 Operator precedence and associativity

      Null Coalescing 运算符 (??) 的优先顺序远低于 '+'。因此,“+”总是首先被评估。

      在你的情况下,

      int a = 10;
      int? b = 20;
      int? c = null;
      

      a+c??b 计算为 (a+c)??b = (10+null)??20 = null??20 = 20

      c??b+a 计算为 c??(b+a) = null??(10+20) = (10+20) = 30

      【讨论】:

      • 一个很好的答案。但最好将最后一行写成:c??b+a 的计算结果为 c??(b+a) = null??(10+20) = (10+20) = 30。如果c 不为空,则永远不会执行加法。但这与您绝对正确解释的优先级不同。
      【解决方案4】:

      c??b + a 被评估为

       c?? (b+a)
      

      或稍微扩大

       c == null ? b + a : c
      

      或者如果我们用实际值替换

       null == null ? 20 + 10 : null) 
      

      而 a +c??b 被评估为

       (a+c)??b
      

      或者如果我们稍微扩展一下

       (a + c) == null ? b : c+a
      

      或者如果我们用实际值替换

       (10 + null) == null ? 20 : 10 + null
      

      又可以简写成

       null == null ? 20 : null
      

      如果至少有一个操作数为空,则可空类型的加法运算符总是返回空

      【讨论】:

      • 原发帖人不就是这么想的吗?如果??真的绑定得更强,他可以改变加数的顺序。
      • 就目前而言,令人困惑。 c ?? b+a 更像:c == null ? (b+a) : c
      【解决方案5】:

      既然 c 为空,那么答案就是 b!那是你的双倍?做。

      【讨论】:

      • a+ 在做什么?没有效果?
      • 更像:“由于 a+c 为空,答案为 b!”
      【解决方案6】:

      ?? 运算符用于检查空值。它返回有问题的值,或者如果它为空,则返回后备。

      c ?? b 表示“c,除非 c 为空,在这种情况下为 b”。

      c ?? b + a 检查 c,发现它为空,并改用 b (20)。然后添加 (10) 得到 30.*

      a + c ?? b 似乎将?? 应用于a + c 而不仅仅是c,导致整个东西被b (20) 替换。

      *不确定这种情况下的操作顺序,可能由于 c 为空而使用 (b + a)。

      【讨论】:

      • 另外,正确地说,“c ?? b + a 检查c,发现它为空,并改用 b+a。”因此它评估b+a
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-02-17
      • 2012-10-25
      • 1970-01-01
      相关资源
      最近更新 更多