2017-06-19 3 views
2

theme.VersionStampに別のnullチェックを挿入したいとします。 SequenceEqual引数の中に挿入する方法はありますか?null伝播 - 2番目のヌルチェック

if (theme.VersionStamp != null) 
{ 
    if (!origTheme?.VersionStamp.SequenceEqual(theme.VersionStamp) ?? false) 
    { 
     throw new TwConcurrencyException(); 
    } 
} 
+0

_ "テーマに別のヌルチェックを挿入したい" _ - なぜですか?あなたがコードのその部分に着くときには、あなたはすでにその値が 'null 'ではないことを知っています。そこにヌルチェックのポイントは何ですか?ポイントがあれば、どのようなヌルチェックをしたいですか?あなたは何を結果にしたいですか?あなたの質問を修正して、あなたがやっていることを明確に示し、そのコードが何をしているのか、正確に何をしたいのか、何が分かりませんかを説明してください。 –

答えて

1

それは右とにかく、あなたがそのヌルチェックif (theme.VersionStamp != null){を作成してから進められているので、必須ではありません。しかし、あなたはまだまた、私は、引数を渡すときにはnullチェックを追加し、

残念ながら
if (theme != null && theme.VersionStamp != null) 
{ 
+0

「テーマ」には常に値があります。 theme.versionstampはnullでもかまいません。 – jengfad

+0

'theme'もnullでもかまいませんが、最初のチェックは' if(theme?.VersionStamp!= null) 'です。これは両方をカプセル化します。 –

+0

私はコードの元の著者にチェックしたところ、特定のロジックがヒットしたときにオブジェクトのバージョンスタンプにデータを入力しなかったことが判明しました。これがヌルバージョンスタンプのインスタンスを取得している理由です。とにかく、助けてくれてありがとう、私は多くを学んだ。 :) – jengfad

1

以下に、あなたの最初のnullチェックを延長するもう一度チェックして、パスのデフォルト引数

if (!origTheme?.VersionStamp.SequenceEqual(theme.VersionStamp ?? new VersionStamp()) ?? false) 

のようでしたありえない。

あなたが得ることができる最短は次のようになります。

if (theme?.VersionStamp == null || 
    !origTheme?.VersionStamp?.SequenceEqual(theme.VersionStamp) ?? false) 
{ 
    throw new TwConcurrencyException(); 
} 

ラーフルがやっているようorigThemeVersionStampがデフォルトVersionStampSequenceEqualに等しい場合は、誤ってtrueを返しますので、私は、デフォルトの引数を渡すことはありません

+1

C#7と[表現を投げる](https://github.com/dotnet/roslyn/issues/13389)これが可能になりました: '.SequenceEqual(theme.VersionStamp ?? throw new ArgumentException(...) ) '**この**のケースでは、前の' if'ステートメントのために不要です。 –