2015-10-23 5 views
8

背景:+=オペレーターがイベントのaddメソッドを呼び出すためだけの構文糖ですのでC# : The New and Improved C# 6.0null伝播がイベントに対して機能しないのはなぜですか?

using System; 

internal sealed class Program 
{ 
    private sealed class Inner 
    { 
     internal int Value { get; } = 42; 
     internal void DoSomething(int value) { } 
     internal event EventHandler Event; 
    } 

    private sealed class Outer 
    { 
     internal Inner Inner { get; } = new Inner(); 
    } 

    private static void Main(string[] args) 
    { 
     Outer outer = null; 

     // Works as expected (does not call Inner and Value, val is null) 
     int? val = outer?.Inner.Value; 

     // Works as expected (does not call Inner and DoSomething) 
     outer?.Inner.DoSomething(42); 

     // CS0070: The event 'Program.Inner.Event' can only appear on the left hand 
     // side of += or -= (except when used from within the type 'Program.Inner') 
     outer?.Inner.Event += (s, e) => { }; 
    } 
} 

、私は最後の行はDoSomething()にだけ呼び出しのようにコンパイルされることを期待しているだろう(そしてそれはdoesnのこと実行時には何もしません)。

+2

これが許可され、 'outer'がnullの場合、どうなると思いますか? – DavidG

+0

@DavidG DoSomething()の呼び出しのように、かっこ内の注釈を参照してください。何もしないでください。 –

+3

しかし、あなたは 'outer?.Inner.Value = 42;'を実行できないことに気づくでしょう。 – DavidG

答えて

5

演算子は実際にはメソッド呼び出しの構文上の砂糖ですが、メソッド呼び出しではなく演算子です。

+=演算子の左側のコードは次のようになります。その演算子の左側に

​​

コードに割り当てることができる何かに評価する必要があると+オペレータは、上の定義されていますそれ(例えば、代理人型の変数)、またはイベントです。

outer == nullの場合、このコードはイベントに評価されないため、違法です。