まず、完全な例:
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();
}
}
以下は、 を返すこともあれば、 を返すことMaybeFoo
もあるメソッドです。R# が常に null または非 null であることを自動的に解決しないように使用しました。null
Foo
Random
さて、あなたがこの行で言うように:
var bar = foo != null ? foo.SomeBool : false;
R# はインスペクションSimplify conditional operatorを提供します。これはどういう意味ですか?さて、いつものように、Alt+Enterして提案を受け入れ、それを何に置き換えたいかを確認できます。この場合は次のようになります。
var bar = foo != null && foo.SomeBool;
さて、あなたの懸念について:
しかし、FirstOrDefault() は null を返す可能性があるため、ここでは null チェックが必要だと思います。
では、私と Resharper のどちらが間違っているのでしょうか?
ええと、簡単に言えば、あなたはそうです。ここではまだ null チェックが行われており、&&
演算子は を短絡しているため、2 番目のオペランド ( foo.SomeBool
)は、最初のオペランドが である場合にのみ評価されtrue
ます。NullReferenceException
したがって、 isの場合にfoo
はa はありませんnull
。最初のチェックは失敗し、bar
割り当てられfalse
ます。
だから二行
var bar = foo != null ? foo.SomeBool : false;
と
var bar = foo != null && foo.SomeBool;
は意味的に同等であり、R# は通常より簡潔なバージョンを好みます (特に、明示的なtrue
s とfalse
条件文の s は、多くの場合、冗長なコードのマークです)。そうでない場合は、このインスペクションをオフにすることができます。