【问题标题】:What is the `is` operator followed by empty double brackets? [duplicate]后跟空双括号的 `is` 运算符是什么? [复制]
【发布时间】:2021-07-11 12:53:24
【问题描述】:

这些空的双括号在这个表达式中有什么作用?

record MyRecord(int i, int? j);

public void MyMethod()
{
    MyRecord myVar = new(10);

    if (myVar is { i: { } })
    {
          // ?
    }

    if (myVar is { j: { } })
    {
          // ?
    }
}

我没有在参考页面中找到。

这只是检查null 的另一种方式吗?

【问题讨论】:

  • 看起来像是一些匿名类型检查。但是匿名类型必须事先定义。
  • 你能分享一个minimal reproducible example吗?
  • @mjwills 我真的认为那行就足够了,但没关系。刚刚用一个最小的可重现示例更新了问题......
  • @JL0PD 谢谢!您要提交答案以便我接受吗?

标签: c#


【解决方案1】:

它用于在 c# 7 中检查它是否不为空。它利用模式匹配。从 c# 9 开始不再需要它,因为您可以使用 is not null

【讨论】:

  • 在这种情况下你会如何使用is not null?这不是更多地测试该字段是否为空吗?
  • 所以模式匹配中使用的空双括号表示not null?
  • 是的。它被称为对象模式。这意味着你测试的任何东西都不是空的。您现在可以(但当时不能)改用is not null。虽然你也有一个递归模式(i/j 属性),它更容易使用空括号
【解决方案2】:

这是模式匹配的一部分。

https://docs.microsoft.com/dotnet/csharp/language-reference/operators/patterns#property-pattern

你写的只要是值就应该通过,类似于写

if (myVar is object && myVar.i is object)
{
}

if (myVar is object && myVar.j is object)
{
}

【讨论】:

  • 感谢您的参考链接。但是,它似乎与您的建议有很大不同。我写的是检查null,而不是对象;还是我理解错了?
  • @andresantacruz 实际上检查对象等同于检查不为空,value != null 等效于!(value is null)value is object
  • 不太一样:当myVarnull 时,此答案中的代码将抛出NullReferenceException,而问题中的代码不会。
  • @huysentruitw 是正确的,感谢您指出。我已经更新了答案。
  • rowVersion 不为空 && rowVersion.Length
猜你喜欢
  • 2022-01-16
  • 2011-08-23
  • 1970-01-01
  • 2020-09-20
  • 2021-11-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多