为什么空传播不适用于事件

本文关键字:适用于 事件 不适用 传播 为什么 | 更新日期: 2023-09-27 18:19:02

背景:c#:新的改进的c# 6.0

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

由于+=操作符只是调用事件的add方法的语法糖,所以我希望最后一行编译起来就像调用DoSomething()一样(并且它在运行时不做任何事情)。

为什么空传播不适用于事件

+=操作符确实是方法调用的语法糖,但它是一个操作符,而不是方法调用。

+=操作符左侧的代码为:

outer?.Inner.Event

操作符左侧的代码需要求值为可以赋值的东西,并且在其上定义了+操作符(例如委托类型的变量),或者是一个事件。

如果outer == null,此代码不能求值为事件,这就是为什么它是非法的。