Подтвердить что ты не робот

Вызов неоднозначен между следующими способами или свойствами

Предположим, что у меня есть эти два 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)
4b9b3361

Ответ 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);