Вызов неоднозначен между следующими способами или свойствами
Предположим, что у меня есть эти два ctors:
public SomeClass(string a, Color? c = null, Font d = null)
{
// ...
}
public SomeClass(string a, Font c = null, Color? d = null)
{
// ...
}
~, и я делаю это:
SomeClass sc = new SomeClass("Lorem ipsum");
Я получу следующее: "Ошибка 1 Вызов неоднозначен между следующими методами или свойствами [...]"
Мне кажется очевидным, что неважно, какой из них я называю конечным результатом, то же самое (по крайней мере в этом конкретном случае, и для меня, что все, что имеет значение прямо сейчас), так каковы мои варианты обойти это?
ИЗМЕНИТЬ 1:
@oltman: упрощенный пример.
Я просто хочу писать
[...] new SomeClass("Lorem", Color.Green)
вместо
[...] new SomeClass("Lorem", null, Color.Green)
Ответы
Ответ 1
Оба конструктора принимают одинаковое количество аргументов, но в другом порядке. Поскольку вы указали значения по умолчанию для двух параметров конструктора, компилятор не может различать две перегрузки при отсутствии второго аргумента.
Я бы посоветовал удалить существующие конструкторы и заменить на следующее:
public SomeClass(string a, Color? color, Font font)
{
// constructor implementation
}
public SomeClass(string a) : this(a, null, null) {}
public SomeClass(string a, Color color) : this(a, color, null) {}
public SomeClass(string a, Font font) : this(a, null, font) {}
Ответ 2
Один из способов заставить его работать:
SomeClass sc = new SomeClass("Lorem ipsum", (Color?)null, (Font)null);
Ответ 3
Можно ли создать другой конструктор, который принимает только строку, и обновить указанные выше конструкторы, чтобы сделать свои обязательные параметры?
Если идея состоит в том, что вы можете построить объект, всегда поставляя строку, а затем, опционально поставляя цвет или шрифт или и то, и другое, как насчет этого:
public SomeClass(string a)
{
// ...
}
public SomeClass(string a, Color? c)
{
// ...
}
public SomeClass(string a, Font f, Color? d = null)
{
// ...
}
Ответ 4
Я получу следующее: "Ошибка 1 Вызов неоднозначен между следующими методами или свойствами [...]"
Мне кажется очевидным, что неважно, на кого я ссылаюсь, поскольку конечный результат тот же
Вызов неоднозначен. Каждый конструктор уникален - неважно, создают ли они и возвращают экземпляр, потому что в каждом конструкторе может быть разная логика. Компилятор все еще не знает, какой конструктор вы имеете в виду.
Ответ 5
Это прекрасный пример anti-pattern
, лучший способ избежать этого - ответить @Phil Klein.
Вот еще один синтаксис для передачи класса как null:
SomeClass sc = new SomeClass("Lorem ipsum", null as Color, null as Font);