У меня есть следующие два 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
, он не должен быть неоднозначным, не так ли? Что мне не хватает? Если это всего лишь ограничение языка: какой элегантный способ обойти эту проблему?