如何在 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 中使用空条件运算符? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

在处置模式中使用空条件运算符时 CA2213 触发

为啥我不能在没有括号的插值字符串中使用条件运算符? [复制]

我可以在 C 中使用位运算符而不是条件运算符吗? [复制]

空条件运算符不适用于泛型方法中的 Func<T>

这个条件运算符是做啥的? [复制]

空条件运算符和 !=