【发布时间】:2021-04-14 19:00:00
【问题描述】:
我注意到 ReSharper 在 C# 代码中建议使用以下语法。 老:
if (wizardStep !=null && wizardStep.progressId > 0)
新:
if (wizardStep is {progressId: > 0})
效果很好,我喜欢它 - 看起来比原版更干净。但是对于我的生活,我找不到任何关于这种语法的文档。什么是可能的,什么是限制,等等。谷歌搜索 is 并不是很有帮助。微软C# documentation 没有提到任何类似的东西!
我意识到,这个问题有点延伸了 SO 规则,我不是在征求意见。或许可以证明这段代码是合法的。
更新:不知道是谁结束了这个问题 - 但它与它所链接的问题没有共同点!这是关于 C# 9 中的关系模式;关于 C# 8 中 is 语法的那篇文章。
【问题讨论】:
-
它同时使用Property Pattern 和Relational Pattern(在属性上)。
-
是的,这段代码是合法的,并且是 C# 中新的“模式匹配”运动的一部分。 docs.microsoft.com/en-us/dotnet/csharp/pattern-matching 和 docs.microsoft.com/en-us/archive/msdn-magazine/2019/may/…,特别是您在此处看到的构造是“属性模式”docs.microsoft.com/en-us/dotnet/csharp/whats-new/…
-
谢谢!我看到了模式匹配(虽然我之前没有看到 MSDN 杂志的文章;非常有帮助的补充)——我可以从
Positional Pattern精神飞跃到匿名类型......但是 condition 在对象定义让我感到困惑。 -
这就是关系模式部分。你现在可以做类似
if (x is (> 0 and < 10))...is之后的部分是两个关系模式的连接模式,我在那里使用了多余的括号来更好地了解它是如何工作的。 -
is {progressId: 0}之类的东西是属性上的常量模式。0是常数。所以现在> 0是一个关系模式。