чтобы увидеть, может ли это быть улучшено в будущей версии языка.
дуя новые функции в C # 7.x, я создал следующий класс:
using System;
namespace ValueTuples
{
public class Person
{
public string Name { get; }
public DateTime BirthDate { get; }
public Person(string name, DateTime birthDate)
{
Name = name;
BirthDate = birthDate;
}
public void Deconstruct(out string name,
out int year, out int month, out int day)
{
name = Name;
year = BirthDate.Year;
month = BirthDate.Month;
day = BirthDate.Day;
}
public void Deconstruct(out string name,
out int year, out int month,
out (int DayNumber, DayOfWeek DayOfWeek) day)
{
name = Name;
year = BirthDate.Year;
month = BirthDate.Month;
day.DayNumber = BirthDate.Day;
day.DayOfWeek = BirthDate.DayOfWeek;
}
}
}
И следующий тестовый код:
using System;
namespace ValueTuples
{
class MainClass
{
static void Main()
{
var dh = new Person("Dennis", new DateTime(1985, 12, 27));
// DECONSTRUCTION:
(string name, _, _, (_, DayOfWeek dow)) = dh;
Console.WriteLine($"{name} was born a {dow}");
}
}
}
Если класс Person включает только перегрузку SECOND Deconstruct, код компилируется и работает нормально («Деннис родился в пятницу»). Но как только первая перегрузка добавлена в Person, компилятор начинает жаловаться, сообщая об ошибке:
Вызов неоднозначен между следующими методами или свойствами: «Person.Deconstruct (out string, out int, out int, out int)» и «Person.Deconstruct (out string, out int, out int, out (int DayNumber, DayOfWeek») DayOfWeek)) '(CS0121) (ValueTuples)
Я прочитал документацию по MSDN и GitHub, но мне не ясно, почему компилятор не может определить, что единственной применимой перегрузкой является вторая, учитывая шаблон внутреннего кортежа в левой части назначения. Любые разъяснения будут оценены.