无法分配条件访问表达式 - C# 空传播 += 事件

Conditional Access expression cannot be assigned - C# null-propagation += events

我最喜欢的 C# 特性之一是 CS6 中的“null-propagation”。

这为我们许多人清理了很多代码。

我遇到过这似乎不可能的情况。我不确定为什么,因为我认为 null-propagation 只是一些编译器魔法,可以为我们做一些 null 检查,让我们维护更清晰的代码。

在钩入事件的情况下..

 public override void OnApplyTemplate()
    {
        _eventStatus = base.GetTemplateChild(PART_EventStatus) as ContentControl;

        // This not permitted and will not compile
        _eventStatus?.IsMouseDirectlyOverChanged += EventStatusOnIsMouseDirectlyOverChanged;

        // but this will work
        if(_eventStatus != null) _eventStatus.IsMouseDirectlyOverChanged += EventStatusOnIsMouseDirectlyOverChanged;

        base.OnApplyTemplate();
    }

    private void EventStatusOnIsMouseDirectlyOverChanged(object sender, DependencyPropertyChangedEventArgs dependencyPropertyChangedEventArgs)
    {
        throw new NotImplementedException();
    }

编译输出显示:

 error CS0079: The event 'UIElement.IsMouseDirectlyOverChanged' can only appear on the left hand side of += or -=

所以,我的问题是 - 我对空传播有什么误解?为什么这不是允许的语法?

表达式(空传播运算符总是 returns)不能用作赋值的左侧部分。

这是设计使然。空值传播运算符允许在计算表达式时传播空值,但它不能用作赋值的目标。

这样想:运算符returns一个。但是,您需要在赋值的左侧有一个 variable。在那里有一个值是没有意义的。

关于此的 issue 已打开,目前已作为功能请求打开。我们当时得到的回复是这样的:

The ?. Operator never produces an lvalue, so this is by design.