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

本文关键字:其他 情况 是否 于关闭 | 更新日期: 2023-09-27 18:34:53

考虑下面的代码

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);
        }

为什么结果会存在差异?是因为关闭吗?

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

第二个代码:

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

(<condition>) ? (<value1>) : (<value2>)结构有误。如果 a 不为 null(它不是,则 consuruction 返回 a,它不执行任何加法(。

因为

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

相当于

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

在 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))

这是因为如果a != null只是aAdd1 中的三元表达式返回,则其余部分不会被计算