4

メンバー アクセスを実行する前に、null 条件演算子を使用して null をテストできることは既に知ってい ます。

例えば ​​:

 int? length = customers?.Length; // null if customers is null 
 Customer first = customers?[0];

customersが null の 場合、null を返しcustomers?.Length 、それが変数になりますcustomers?.Lengthnullint? length = ...

また、マルチスレッド環境でのメソッド呼び出しの単一のアトミック操作に使用できることも知っています。

public void OnFoo()
{
    Foo?.Invoke(this, EventArgs.Empty);
}

しかし

AFAIU - もしそうFooならnull

 Foo?.Invoke(this, EventArgs.Empty);

また〜だnull

そして、私たちは残っています

public void OnFoo()
{
    null; //compilation error
}

そして、私は尋ねます:

質問

null条件演算子は、nullをテストするためだけのものではないようです。ある場合は、さらに深く移動します: x?.y?.c?.d -

しかし、それはコードのトグルのようにも機能します:

このような:

  public void OnFoo()
    {
        Foo?.Invoke(this, EventArgs.Empty); //Let's assume Foo =null;
    }

なる

  public void OnFoo()
    {

    }

私は正しいですか?その点に関するドキュメントは見つかりませんでした。

4

1 に答える 1

6

null 条件演算子は、結果が式になる演算子です。ステートメントではありません。

Foo?.Invoke(this, EventArgs.Empty)と同等であるというあなたの論理は、null当てはまらない一種の「テンプレートの置き換え」を想定しているように見えるため、実際には当てはまりません。

式のタイプ

Foo?.Invoke(this, EventArgs.Empty)

戻り値の型Invokeがあるため、何もありません。voidあなたは書くことができません:

// Invalid
var result = Foo?.Invoke(this, EventArgs.Empty);

これは、C# 5 仕様の 7.6.5 と同じです。

invocation-expression の評価結果は、次のように分類されます。

  • invocation-expression が を返すメソッドまたはデリゲートを呼び出した場合void、結果は何もありません。何も分類されない式は、ステートメント式 (§8.6) のコンテキストで、またはラムダ式 (§7.15) の本体としてのみ許可されます。そうしないと、バインド時エラーが発生します。
  • それ以外の場合、結果はメソッドまたはデリゲートによって返される型の値になります。

メンバー呼び出しでは、null 条件演算子を使用できます。この時点では、一次式が null 以外の値に評価された場合にのみ呼び出しが実行されます。null 条件演算子を含む呼び出し式の結果は、通常の.演算子を使用した場合と同じですが、結果が null を許容しない値の型である場合、null 条件演算子を使用した結果は、対応する null を許容する値の型になります。 .

もちろん、これらはすべて、C# 6 仕様が発表されたときに、より正確に記述される予定ですが、それがいつになるかはわかりません。(現時点では、C# 6 の仕様はないと思います。MS の内部にはあると思いますが、公開されているものではないことは確かです。ECMA の標準化プロセスが C# 5 の標準化に近づいているため、リリースに影響を与える可能性があります。 C# 6 のプロセス)。

于 2016-08-22T08:23:18.173 に答える