如何翻译"var a = collection?.First()?. somePropA ?? new A();"

and*_*hin 2 c# nullable null-coalescing

使用null-coalescing运算符在赋值表的赋值右侧单个问号的目的是什么?例:

var a = collection?.First()?.somePropA ?? new A();
Run Code Online (Sandbox Code Playgroud)

Dio*_* V. 6

单引号(?.)是在C#6.0中新添加的,表示null检查.

因此,例如,以下代码是相同的;

var foo = bar?.bar2;
Run Code Online (Sandbox Code Playgroud)

要么

var foo = null;
if (bar != null)
    foo = bar.bar2;
else
    foo = null;
Run Code Online (Sandbox Code Playgroud)

但是,两者仍然可以返回null.因此,??如果结果确实如此,可以使用检查来分配值null.

话虽这么说,可以写下面的代码;

var foo = bar?.bar2 ?? new Bar2();
Run Code Online (Sandbox Code Playgroud)

这基本上是一样的

var foo = null;
if (bar != null)
    foo = bar.bar2;
else
    foo = new Bar2();
Run Code Online (Sandbox Code Playgroud)

?.多次使用可以真正缩短您的代码.例如,考虑以下行;

var foo = bar?.bar2?.bar3?.bar4?.bar5 ?? new Bar5();
Run Code Online (Sandbox Code Playgroud)

这是语法糖

var foo = null;
if (bar != null)
{
    if (bar.bar2 != null)
    {
        if (bar.bar2.bar3 != null)
        {
            if (bar.bar2.bar3.bar4 != null)
            {
                if (bar.bar2.bar3.bar4.bar5 != null)
                    foo = bar.bar2.bar3.bar4.bar5;
                else
                    foo = new Bar5();
            }
            else
                foo = new Bar5();
        }
        else
            foo = new Bar5();
    }
    else
        foo = new Bar5();
}
else
    foo = new Bar5();
Run Code Online (Sandbox Code Playgroud)

当然,已经有更好的方法来编写上述内容(例如,通过foo = new Bar5()在进行所有检查之前进行初始化),但为了清楚起见,我保持这种方式.