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).
Czego można się było spodziewać, gdyby było to dozwolone, a "zewnętrzne" miało wartość zerową? – DavidG
@DavidG Patrz uwaga w nawiasach, to powinno nic nie robić, tak jak wywołanie DoSomething() –
Ale zauważysz również, że nie możesz zrobić 'zewnętrznego? .Inner.Value = 42;' – DavidG