无法分配条件访问表达式 - 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.
我最喜欢的 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.