“is”操作符后面大括号的含义是什么?

17

我在一些C#源代码中发现了以下的一行:

if(!(context.Compilation.GetTypeByMetadataName("Xunit.FactAttribute")
         is { } factAttribute))

这里还有另一个:

if(!(diagnostic.Location.SourceTree is { } tree))

is运算符后面的花括号({ })的含义是什么?

1个回答

24

这是一个在C# 8.0中引入的新模式匹配功能,称为属性模式。在此特定案例中,它用于检查对象不为空,以下是链接文章中的示例:

static string Display(object o) => o switch
{
    Point { X: 0, Y: 0 }         p => "origin",
    Point { X: var x, Y: var y } p => $"({x}, {y})",
    {}                           => o.ToString(),
    null                         => "null"
};

它是否与使用“非空”模式相同?我知道空括号允许我们为此模式创建别名,但如果我们不需要别名,我不确定情况如何。 - anuith
1
@anuith 是的,它可以。如果你不需要别名,你应该能够互换使用它们。 - Guru Stron
@anuith 当你想要将检查的值直接赋给新声明的变量时,需要使用花括号模式,例如 if (iterator.Read() is {} item) - d.k.

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接