Вызов неоднозначен между следующими методами или свойствами - PullRequest
17 голосов
/ 13 января 2012

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

Ответы [ 5 ]

25 голосов
/ 13 января 2012

Оба конструктора принимают одинаковое количество аргументов, но в другом порядке.Поскольку вы указали значения по умолчанию для двух параметров конструктора, компилятор не может различить две перегрузки, когда второй аргумент не указан.

Я бы посоветовал вам удалить существующие конструкторы и заменить на следующее:

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) {}
9 голосов
/ 13 января 2012

Один из способов заставить его работать:

SomeClass sc = new SomeClass("Lorem ipsum", (Color?)null, (Font)null);
2 голосов
/ 19 ноября 2017

Это прекрасный пример anti-pattern, лучший способ избежать этого - ответ @Phil Klein.

Вот еще один синтаксис для передачи класса в виде null:

SomeClass sc = new SomeClass("Lorem ipsum", null as Color, null as Font);
1 голос
/ 13 января 2012

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

Если идея заключается в том, что вы можете сконструировать объект, всегда указав строку, а затем опционально указав цвет или шрифт или оба, как об этом:

public SomeClass(string a)
        {
            // ...
        }

public SomeClass(string a, Color? c)
        {
            // ...
        }

public SomeClass(string a, Font f, Color? d = null)
        {
            // ...
        }
0 голосов
/ 13 января 2012

Я получу это: «Ошибка 1 Вызов неоднозначен между следующими методами или свойствами [...]»

Мне кажется, что не имеет значения, какой из нихЯ имею в виду, что конечный результат тот же

Вызов является неоднозначным.Каждый конструктор уникален - не имеет значения, если они оба создают и возвращают экземпляр, потому что в каждом конструкторе может быть разная логика.Компилятор до сих пор не знает, какой конструктор вы имеете в виду.

...