2017-06-06 5 views
1

誰かが以下のステートメントがどのように動作するかを説明することはできますか?私はそれを知っている??演算子は、NULLでない場合は最初の引数を返します。しかし、私が見たときに少し混乱しましたか? 'file'変数に続いて。??オペレーター - 1つのライナー条件で使用する

return file?.ImportStatus ?? ImportStatusEnum.Unknown; 
+0

これは重複した回答ではない伝播演算子が記述されているため、重複しません。 – dasblinkenlight

答えて

9

これはnull propagationヌルの組み合わせ演算子を合体です。これは次の場合にImportStatusEnum.Unknownを生成する

は: - この場合、.ImportStatusが評価されていない、と??の左側がnullなる、または

  • fileである

    • filenullありますnullではありませんが、ImportStatusnullです - この場合、の左側3210もnullであるため、右側が使用されます。

    どちらfileもそのImportStatusnullしている場合は、その後、file.ImportStatusの値が式全体の結果として使用されます。

  • 5

    @dasblinkenlightはちょうどそれに別の道を示すために、それが(評価の順で)次のように書くことができ、正しいです:

    if (file == null) return ImportStatusEnum.Unknown; 
    if (file.ImportStatus != null) 
        return file.ImportStatus; 
    else 
        return ImportStatusEnum.Unknown; 
    
    +0

    @ kurakura88 - いいえ、ガレブのコードは正しいです。 – Enigmativity

    +0

    OK、私の間違いは、評価はまだ次の?明らかに。 – kurakura88

    1

    実際には、コンパイラがするかどうかに基づいて異なるコードを生成します。 ImportStatusがNULL可能ですです。それはので、このように、NULL可能でない場合:プロパティはNULL可能ある場合

    return file != null ? file.ImportStatus : ImportStatusEnum.Unknown; 
    

    if (file != null) 
        return file.ImportStatus; 
    return ImportStatusEnum.Unknown; 
    

    と同じである:

    public ImportStatusEnum ImportStatus {get; set;} 
    

    、コンパイラはこれを生成します。ので、このように:

    public ImportStatusEnum? ImportStatus {get; set;} 
    //OR 
    public Nullable<ImportStatusEnum> ImportStatus {get; set;} 
    

    @dasblinkenlightと@garethbが回答に示したことを行います。

    関連する問題