由于关闭或其他原因,是否发生以下情况?

时间:2014-12-22 11:50:32

标签: c#

考虑以下代码

static void Main(string[] args)
        {
            var x = Add(5, 5); // value 10
            var y = Add1(5, 5); // value 5  
        }

        static public int? Add(int? a, int? b)
        {
            a = a != null ? a : 0;
            b = b != null ? b : 0;
            return ( a+b );
        }

        static public int? Add1(int? a, int? b)
        {
            return (a != null ? a : 0 + b != null ? b : 0);
        }

为什么结果出现差异?是因为关闭?

4 个答案:

答案 0 :(得分:3)

第二个代码:

return (a != null ? a : 0 + b != null ? b : 0);

(<condition>) ? (<value1>) : (<value2>)构造中有错误。如果a不是null(并且它不是,那么consuruction返回a,它不会执行任何添加)。

答案 1 :(得分:2)

因为

return (a != null ? a : 0 + b != null ? b : 0)

相当于

if (a != null)
{
    return a;
} 
else 
{
    return b != null ? b : 0;
}

答案 2 :(得分:1)

这是因为a != null只有aAdd1中的三元表达式返回,其余的不会被评估

答案 3 :(得分:1)

在C#规范的语言中,这是因为加法+运算符的优先级高于条件?:运算符。

根据规范的第7.3.1节,

  

当表达式包含多个运算符时,运算符的 优先级 控制各个运算符的计算顺序。例如,表达式x + y * z的计算结果为x + (y * z),因为*运算符的优先级高于二进制+运算符。

因此

a != null ? a : 0 + b != null ? b : 0

评估为

(a != null) ? a : (0 + ((b != null) ? b : 0))