【问题标题】:New conditional syntax for *is* keyword in C# [duplicate]C# 中 *is* 关键字的新条件语法 [重复]
【发布时间】: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 语法的那篇文章。

【问题讨论】:

标签: c# .net-5


【解决方案1】:

ReSharper 建议的是模式匹配功能的组合,其中之一是 C# 9.0 中的新功能。

{ progressId: ... } 是一个Property Pattern,用于测试progressId 属性。它是递归模式之一,这意味着其他模式可以嵌套在其中。

在 C# 9.0 之前,您几乎无法在属性模式中使用 int 属性。你可以嵌套一个像0这样的常量模式,即{ progressId: 0 },来测试progressId是否等于0

C# 9.0 引入了几种新的模式。 ReSharper 建议您使用其中一个 Relational Pattern 来对该属性进行范围测试。

模式匹配是表达测试的另一种方式。你说你喜欢它,那太好了;有些人可能不会。它生成的 IL 代码将是相同的,所以这完全是一个偏好问题。我编译了 ReSharper 建议的模式匹配版本,ILSpy 将其反编译为您最初拥有的版本。


解决其中一个 cmets:{ ... } 部分看起来像匿名类型,因为它前面没有类型名称,但没有 new 关键字,它不是匿名类型。它只是一种模式,一种用于表达测试的语法,这些测试被转换为您在没有模式匹配的情况下会看到的更基本的测试。它没有类型,不像被测试的表达式。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-11
    • 1970-01-01
    • 2010-11-15
    • 2017-02-16
    • 2011-04-03
    相关资源
    最近更新 更多