考虑以下代码
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);
}
为什么结果出现差异?是因为关闭?
答案 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
只有a
由Add1
中的三元表达式返回,其余的不会被评估
答案 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))