C#8位置模式与解构模式

时间:2018-06-15 08:59:18

标签: c# .net roslyn c#-8.0

在模式匹配的第一个提议中,使用以下语法定义递归模式:

recursive_pattern
    : positional_pattern
    | property_pattern
    ;

链接:https://github.com/dotnet/csharplang/blob/master/proposals/patterns.md 为了演示位置模式,.Net团队使用了笛卡尔的例子,它覆盖了opreator:

public static bool operator is(Cartesian c, out double R, out double Theta)

注意:我知道'是' opreator不能在C#中重写

在另一个规范中: https://github.com/dotnet/csharplang/issues/1054

Recursive pattern matching defined like the following:
    pattern
        : declaration_pattern
        | constant_pattern
        | deconstruction_pattern
        | property_pattern
        ;

当我使用以下链接测试模式匹配(上述)时: https://sharplab.io

解构模式工作正常但位置模式没有(我不能覆盖位置模式提议示例中描述的opreator)

我的问题:

位置模式和解构模式之间有什么不同?

工作守则:

using System;

namespace ConsoleApp2
{
  class Program
  {
    static void Main(string[] args)
    {
      var stratec = new Company
      {
        Name = "stratec",
        Website = "wwww.stratec.com",
        HeadOfficeAddress = "Birkenfeld",
      };

      var firstEmploy = new Employ { Name = "Bassam Alugili", Age = 42, Company = stratec };

      var microsoft = new Company
      {
        Name = "microsoft",
        Website = "www.microsoft.com",
        HeadOfficeAddress = "Redmond, Washington",
      };

      var thidEmploy = new Employ { Name = "Satya Nadella", Age = 52, Company = microsoft };


      DumpEmploy(firstEmploy);
    }

    public static void DumpEmploy(Employ employ)
    {
      switch (employ)
      {

         case Employ{Name:"Bassam Alugili", Company:Company(_,_,_)} employTmp:
          {
            Console.WriteLine($"The employ:  {employTmp.Name}! 1");
          }
          break;


        default:
          Console.WriteLine("Unknow company!");
          break;
      }
    }
  }
}


public class Company
{
  public string Name { get; set; }

  public string Website { get; set; }

  public string HeadOfficeAddress { get; set; }

  public void Deconstruct(out string name, out string website, out string headOfficeAddress)
  {
    name = Name;
    website = Website;
    headOfficeAddress = HeadOfficeAddress;
  }
}

public class Employ
{
  public string Name { get; set; }

  public int Age { get; set; }

  public Company Company { get; set; }


  public void Deconstruct(out string name, out int age, out Company company)
  {
    name = Name;
    age = Age;
    company = Company;
  }
}

如何修改代码以测试位置模式!?

enter image description here

这是链接:你也可以复制并粘贴你会得到相同结果的代码:

Sharplab link with code

1 个答案:

答案 0 :(得分:0)

这是有关文件过时和/或不清楚的问题。 “位置”和“解构”是同义词,均指代带括号的子模式列表。

最新的语法在https://github.com/dotnet/roslyn/blob/features/recursive-patterns/src/Compilers/CSharp/Portable/Syntax/Syntax.xml#L1816

中进行了描述

递归模式具有可选类型,可选的解构模式子句(也称为位置模式子句),可选的属性模式子句和可选的名称。

有限制使用的语义规则(例如,您不能有一个模式,其中所有可选部分都被一次性省略)。

解构模式子句是带括号的子模式列表,这些子模式是带有可选名称-冒号的模式。