Позиционный шаблон C# 8 против шаблона деконструкции

В первом предложении сопоставления с образцом рекурсивный образец был определен со следующей грамматикой:

recursive_pattern
    : positional_pattern
    | property_pattern
    ;

Ссылка: https://github.com/dotnet/csharplang/blob/master/proposals/patterns.md Чтобы продемонстрировать позиционный паттерн, команда.Net использует декартовский пример, который переопределяет опреатор:

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

Примечание: я знаю, что опратор is не может быть переопределен в 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/

Шаблон деконструкции работает нормально, но позиционный шаблон не работает (я не могу переопределить is-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;
  }
}

Как я могу изменить код для проверки позиционного шаблона!?

вот ссылка: вы также можете скопировать и вставить код, вы получите тот же результат:

Sharplab ссылка с кодом

0 ответов

Это вопрос устаревших и / или неясных документов. "позиционный" и "деконструкция" являются синонимами, которые оба ссылаются на заключенный в скобки список подшаблонов.

Последняя грамматика описана в https://github.com/dotnet/roslyn/blob/features/recursive-patterns/src/Compilers/CSharp/Portable/Syntax/Syntax.xml#L1816

Рекурсивный шаблон имеет необязательный тип, необязательное предложение шаблона деконструкции (также называемое предложением позиционного шаблона), необязательное предложение шаблона свойства и необязательное обозначение.

Существуют семантические правила, ограничивающие использование (например, у вас не может быть шаблона, в котором все необязательные части пропускаются одновременно).

Предложение шаблона деконструкции представляет собой заключенный в скобки список подшаблонов, которые представляют собой шаблоны с необязательным двоеточием.

Другие вопросы по тегам