Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 发生以下情况是因为关闭还是其他原因?_C# - Fatal编程技术网

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