2015-10-23 11 views
8

Tło: C# : The New and Improved C# 6.0Dlaczego propagacja zerowa nie działa w przypadku zdarzeń?

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) => { }; 
    } 
} 

Ponieważ operator += jest cukier tylko składniowym na wywołanie metody dodawania zdarzenia, spodziewałem się, że ostatnia linia kompiluje jak wezwanie do DoSomething() (i to nie robi” rób cokolwiek w czasie wykonywania).

+2

Czego można się było spodziewać, gdyby było to dozwolone, a "zewnętrzne" miało wartość zerową? – DavidG

+0

@DavidG Patrz uwaga w nawiasach, to powinno nic nie robić, tak jak wywołanie DoSomething() –

+3

Ale zauważysz również, że nie możesz zrobić 'zewnętrznego? .Inner.Value = 42;' – DavidG

Odpowiedz

5

Operator += jest rzeczywiście syntaktycznym cukrem dla wywołania metody, ale jest operatorem, a nie wywołaniem metody.

Kod na lewej stronie operatora += jest:

outer?.Inner.Event 

Kod na lewej stronie tego operatora musi ocenić na coś, co może być przypisany do i operator + zdefiniowane na to (np. zmienna typu delegata) lub wydarzenie.

Ten kod nie może zostać oceniony na podstawie zdarzenia outer == null, dlatego jest niezgodny z prawem.

Powiązane problemy