C# 发生以下情况是因为关闭还是其他原因?
考虑下面的代码C# 发生以下情况是因为关闭还是其他原因?,c#,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;
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);
}
为什么结果不一致?是因为闭包吗?这是因为如果如果Add1中的三元表达式返回一个空值,则不计算其余的第二个代码:
return (a != null ? a : 0 + b != null ? b : 0);
有错误吗?:建筑如果a不为null且不为null,则consurcion返回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))