Desconstrução e sobrecargas em C #
Ao investigar os novos recursos do C # 7.x, criei a seguinte classe:
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;
}
}
}
E o seguinte código de teste:
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}");
}
}
}
Se a classe Person incluir apenas a sobrecarga de desconstrução SECOND, o código compila e executa bem ("Dennis nasceu na sexta-feira"). Mas assim que a primeira sobrecarga é adicionada ao Person, o compilador começa a reclamar, sendo a mensagem de erro:
A chamada é ambígua entre os seguintes métodos ou propriedades: 'Person.Deconstruct (string de saída, out int, out int, out int)' e 'Person.Deconstruct (string de saída, out int, out int, out (int DayNumber, DayOfWeek DayOfWeek)) '(CS0121) (ValueTuples)
Eu li a documentação do MSDN e do GitHub, mas não está claro para mim por que o compilador não pode determinar que a única sobrecarga aplicável é a segunda, dado o padrão de tupla interno no lado esquerdo da atribuição. Qualquer esclarecimento será apreciado.