"简化条件三元表达"

Joh*_*han 19 c# asp.net resharper

var foo = context.FOOTABLE.FirstOrDefault(); 
var bar = foo != null ? foo.SomeBool : false;
Run Code Online (Sandbox Code Playgroud)

Resharper告诉我Simplify conditional ternary expression.但我觉得这里需要进行空检查,因为FirstOrDefault()可以返回null.

那么,谁错了,我还是Resharper?

Aak*_*shM 34

首先,一个完整的例子:

class Foo
{
    public bool SomeBool { get; set; }
}

class Program
{
    static void Main(string[] args)
    {
        var foo = MaybeFoo();

        var bar = foo != null && foo.SomeBool;

    }

    static Foo MaybeFoo()
    {
        return new Random().Next() < 10 ? null : new Foo();
    }
}
Run Code Online (Sandbox Code Playgroud)

MaybeFoo是一种有时返回null并有时返回的方法Foo.我已经习惯了Random,R#不会自动解决它始终为null或不为null的问题.

现在,如你所说:

        var bar = foo != null ? foo.SomeBool : false;
Run Code Online (Sandbox Code Playgroud)

R#提供检查简化条件运算符.这是什么意思?好吧,像往常一样,我们可以Alt+ Enter并接受建议,看看它想要替换它,在这种情况下是:

        var bar = foo != null && foo.SomeBool;
Run Code Online (Sandbox Code Playgroud)

现在,关于你的关注:

但我觉得这里需要进行空检查,因为FirstOrDefault()可以返回null.

那么,谁错了,我还是Resharper?

嗯,不久之后,你就是.目前仍然是一个空检查发生在这里,并&&运营商短路,所以第二个操作数(foo.SomeBool),如果第一个是将只进行评估true.所以NullReferenceException在什么时候foo不会有null; 第一次检查将失败bar并将被分配false.

所以这两行

        var bar = foo != null ? foo.SomeBool : false;
Run Code Online (Sandbox Code Playgroud)

        var bar = foo != null && foo.SomeBool;
Run Code Online (Sandbox Code Playgroud)

语义上是等价的,并且R#通常更喜欢更简洁的版本(特别是,条件中的显式trues和falses通常是冗余代码的标记).您可能不会,在这种情况下,您可以关闭此检查.


Dmi*_*kiy 9

ReSharper建议将您的代码更改为:

var bar = foo != null && foo.SomeBool;
Run Code Online (Sandbox Code Playgroud)

这与三元操作完全相同,但看起来更好.代码的逻辑不会改变.