Предположим, например, что я определяю класс Complex
для представления комплексных чисел. Я хотел бы определить два конструктора, чтобы я мог написать, например:
Complex z1 = new Complex(x: 4, y: 3);
Complex z2 = new Complex(r: 2, theta: Math.PI / 4);
Однако я не могу определить конструкторы следующим образом:
public Complex(double x, double y) { ... }
public Complex(double r, double theta) { ... }
потому что оба конструктора будут иметь одинаковую подпись, что недопустимо. Но в C # 4 я могу написать это, используя необязательный аргумент:
public Complex(double x, double y) { ... }
public Complex(double r, double theta, bool unused=true) { ... }
Это работает, я могу использовать указанные выше вызовы конструктора, как и предполагалось. Единственная цель аргумента unused
- сделать подписи разными; он полностью не используется, как при определении, так и при вызове конструктора.
Мне кажется, это уродливый трюк: есть ли лучший вариант?