【问题标题】:What is C# object pattern matching?什么是 C# 对象模式匹配?
【发布时间】:2021-04-20 19:18:51
【问题描述】:

我知道 C# 中的模式匹配类似于:

if (x is TypeY y)
{
  // do thing...
}

这或多或少等同于:

if (x is TypeY)
{
  var y = (TypeY)x;
  // do thing...
}

但是,我在编写 IntelliSense 建议的代码时发现了一些东西。 我有以下代码:

if (top is { } t)
{
  // do stuff if 'top' is NOT NULL
}

本来,我以为我可以做if (top is not null t),我做不到;然后我转到if (top is int t),这是我收到这个建议的时候。 这是什么意思?它是如何工作的?我只在 switch 语句中的模式匹配方面见过它,例如:

class Point
{
  public int X { get; set; }
  public int Y { get; set; }
}

myPoint switch
{
  { X: var x, Y: var y } when x > y => ...,
  { X: var x, Y: var y } when x <= y => ...,
  ...
};

但是,即使这是相当新的,我也不太熟悉更高级的概念。这与我的问题有关吗?

【问题讨论】:

  • top is { } ttop is object t 相同,其中 { } 是匿名的 object 类型。这与我的问题有关吗?- 是的,{ X: var x, Y: var y } 是匿名类型,具有两个属性 XY
  • 这是不一样的。第一个将 t 转换为与 top 相同的类型(但不可为空),而第二个将 t 转换为 object

标签: c# casting pattern-matching


【解决方案1】:

is { } 大致等同于 is not null,但是,有一些区别:

  1. 它可以与不可为空的类型一起使用,例如。 int,而 null 模式不能。
  2. 它可用于转换变量,例如top is { } t

    执行转换时,结果变量与初始变量的类型相同,但不能为空,因此如果它与 int? 一起使用,结果将是 int

    int? nullable = 1;
    if (nullable is { } nonNullable)
    {
        // nonNullable is int
    }
    

    { } 模式在 switch 语句中用作包罗万象时最有用:

    abstract class Car { }
    class Audi : Car { }
    class BMW : Car { }
    // Other car types exist..
    
    Car? car = //...
    switch (car)
    {
        case Audi audi: // Do something with an Audi
        case BMW bmw: // Do something with a BMW
        case { } otherCar: // Do something with a non-null Car
        default: // car is null
    }
    

【讨论】:

    猜你喜欢
    • 2020-02-14
    • 2011-01-14
    • 1970-01-01
    • 2019-09-03
    • 1970-01-01
    • 2020-11-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多