Сопоставление позиционного паттерна с неоднозначностью деконструктора - PullRequest
0 голосов
/ 17 января 2020

У меня есть следующие два structs, представляющих координаты в 2D-матрице:

readonly struct Coordinates
{
    public Coordinate X { get; }
    public Coordinate Y { get; }

    public Coordinates(Coordinate x, Coordinate y)
    {
        X = x;
        Y = y;
    }

    public static implicit operator (Coordinate x, Coordinate y)(Coordinates c)
    => (c.X, c.Y);

    public static implicit operator Coordinates((Coordinate x, Coordinate y) c)
    => new Coordinates(c.x, c.y);

    public void Deconstruct(out Coordinate x, out Coordinate y)
    {
        x = X;
        y = Y;
    }

    public void Deconstruct(out int x, out int y)
    {
        x = X;
        y = Y;
    }
}

readonly struct Coordinate
{
    private int Value { get; }

    public Coordinate(int value)
    {
        if (value < 0)
            throw new ArgumentException(nameof(value));

        Value = value;
    }

    public static implicit operator int(Coordinate c)
    => c.Value;

    public static implicit operator Coordinate(int value)
    => new Coordinate(value);
}

Когда я пытаюсь использовать позиционное сопоставление с образцом следующим образом:

static void Test()
{
    object o = null;
    if (o is Coordinates(var x, 5))
    {
        Console.WriteLine(x);
    }
}

Я получаю ошибка:

Вызов неоднозначен между следующими методами или свойствами: 'Coordinates.Deconstruct (out Coordinate, out Coordinate)' и 'Coordinates.Deconstruct (out int, out int)'

Поскольку первым параметром в шаблоне является int, он не должен быть неоднозначным, не так ли? Что мне не хватает? Если это всего лишь ограничение языка: какой элегантный способ обойти эту проблему?

...