1. ホーム
  2. c#

[解決済み] C# 6.0のクエスチョンマークとドット演算子「?」の意味は?

2022-03-21 12:55:09

質問

VS2015 プレビューの C# 6.0 では、新しい演算子があります。 ?. このように使用することができます。

public class A {
   string PropertyOfA { get; set; }
}

...

var a = new A();
var foo = "bar";
if(a?.PropertyOfA != foo) {
   //somecode
}

具体的にはどのようなことをするのですか?

どのように解決するのですか?

それは null 条件 演算子を使用します。基本的には、以下のような意味です。

最初のオペランドを評価し、それがNULLであれば、結果をNULLとして停止します。そうでない場合は、2 番目のオペランドを (最初のオペランドのメンバアクセスとして) 評価します。

あなたの例では、ポイントは、もし anull であれば a?.PropertyOfA は次のように評価されます。 null という例外が発生します。 null 参照と foo (文字列の == のオーバーロード)、両者が等しくないことがわかり、実行は if ステートメントを使用します。

つまり、こんな感じです。

string bar = (a == null ? null : a.PropertyOfA);
if (bar != foo)
{
    ...
}

... ただし a は一度だけ評価されます。

これは、式の型も変えることができることに注意してください。例えば、次のように考える。 FileInfo.Length . これは、プロパティタイプが long しかし、これをNULL条件演算子と一緒に使うと、結局は long? :

FileInfo fi = ...; // fi could be null
long? length = fi?.Length; // If fi is null, length will be null