以下情况是否由于关闭或其他原因而发生
本文关键字:其他 情况 是否 于关闭 | 更新日期: 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
只是a
由 Add1
中的三元表达式返回,则其余部分不会被计算