Позиционный шаблон 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;
}
}
Как я могу изменить код для проверки позиционного шаблона!?
вот ссылка: вы также можете скопировать и вставить код, вы получите тот же результат:
0 ответов
Это вопрос устаревших и / или неясных документов. "позиционный" и "деконструкция" являются синонимами, которые оба ссылаются на заключенный в скобки список подшаблонов.
Последняя грамматика описана в https://github.com/dotnet/roslyn/blob/features/recursive-patterns/src/Compilers/CSharp/Portable/Syntax/Syntax.xml#L1816
Рекурсивный шаблон имеет необязательный тип, необязательное предложение шаблона деконструкции (также называемое предложением позиционного шаблона), необязательное предложение шаблона свойства и необязательное обозначение.
Существуют семантические правила, ограничивающие использование (например, у вас не может быть шаблона, в котором все необязательные части пропускаются одновременно).
Предложение шаблона деконструкции представляет собой заключенный в скобки список подшаблонов, которые представляют собой шаблоны с необязательным двоеточием.