如何在 WPF 中使用空条件运算符? [复制]
Posted
技术标签:
【中文标题】如何在 WPF 中使用空条件运算符? [复制]【英文标题】:How can I use Null-conditional Operators in WPF? [duplicate] 【发布时间】:2018-06-19 16:59:49 【问题描述】:我们知道,空条件运算符是 c# 6.0(https://msdn.microsoft.com/en-us/magazine/dn802602.aspx) 中的新内容。我尝试在 WPF(.net framework 4.6.1) 中使用它。
这是我正确的代码:
PackageButtonClass PBC = PackageButtonList.Find(x => x.Index == index + 1);
if (PBC != null)
PBC.IsEnabled = false;
我想使用空条件运算符使其简短,如下所示:
PackageButtonList.Find(x => x.Index == index + 1)?.IsEnabled = false;
但是,WPF 会抛出一个错误,即“赋值的左侧必须是变量、属性或索引器” 我的代码有什么问题?您能帮帮我吗?谢谢。
【问题讨论】:
问题:在所有这些样本中,您是否看到任何分配?此外,这不是 WPF 问题。 @john 你展示的也许是我想要的,谢谢。 如果你想要单行,你可以做一个类似于ForEach的扩展方法,以delegate为参数,当值不为null时执行delegate。 【参考方案1】:PackageButtonList.Find(x => x.Index == index + 1)?.IsEnabled = false;
考虑一下如果找不到索引会发生什么?然后您尝试分配给不存在的属性。
因此不支持?.
的这种用法。
【讨论】:
我想这样做:如果找不到索引,则什么都不做。如果找到索引,则更改属性。 顺便问一下,有没有其他方法可以把这些代码简称为? @MelonNG 我不认为有(除非有一个辅助方法采用 lambda 来完成任务。但这比仅仅将if
放入更糟糕(并且可能令人困惑) .【参考方案2】:
这与 WPF 无关。 您不能将 null 条件运算符用作赋值表达式的左侧,原因很明显:
当您编写这样的代码行:Instance?.Property = value;
,而Instance
为空时,
Instance?.Property
将评估为 null,因此您将有一个无意义的代码行说明 null = value
。
这就是编译器不允许这样做的原因。如果您想在这种情况下避免空引用异常,则必须以老式方式进行:
if(Instance != null)
Instance.Property = Value;
你可以用一行代码编写它,但我个人觉得这不太可读:
if(Instance != null) Instance.Property = Value;
更易读的代码是两行代码:
if(Instance != null)
Instance.Property = Value;
【讨论】:
OK。然而,有没有其他方法可以使这些代码变短?【参考方案3】:使用?.
的表达式永远不是左值——也就是说,你可以分配给它的值。
如果是这样,它将有一个条件,在该条件下,该左值必须写入空引用的属性或字段,这将导致 NullReferenceException
。
从逻辑上讲,这可能会发生,在这种情况下,您应该通过仅在分支内对它进行测试的操作来防范它,或者它永远不会发生,在这种情况下,?.
会更好地表示为.
【讨论】:
感谢您的帮助。顺便问一下,还有其他方法可以使我的代码简短吗? 为什么?很短。 我发现在编码中经常需要检查一个变量是否为空,所以不知道有没有更快的方法让它少写代码。哈哈。以上是关于如何在 WPF 中使用空条件运算符? [复制]的主要内容,如果未能解决你的问题,请参考以下文章