2012-01-13 5 views
12

Предположим, у меня есть эти два 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 вызов является неоднозначным между следующими методами или свойствами [...] "

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

EDIT 1: @oltman: упрощенный пример.

Я просто хочу, чтобы иметь возможность написать

[...] new SomeClass("Lorem", Color.Green) 

вместо

[...] new SomeClass("Lorem", null, Color.Green) 
+3

Есть ли причина, вы оба, или это просто упрощенный пример? – oltman

ответ

21

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

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

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) {} 
+0

Это работает чудесами и именно то, что я искал. –

7

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

SomeClass sc = new SomeClass("Lorem ipsum", (Color?)null, (Font)null); 
+0

его очень полезно, когда у вас есть только один аргумент – Eli

1

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

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

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

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

public SomeClass(string a, Font f, Color? d = null) 
     { 
      // ... 
     } 
0

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

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

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

0

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

Вот другой синтаксис для прохождения класса как нуль:

SomeClass sc = new SomeClass("Lorem ipsum", null as Color, null as Font); 
Смежные вопросы