Ответ 1
Для точных правил см. спецификацию разрешения перегрузки. Но вкратце, это происходит следующим образом.
Сначала создайте список всех доступных конструкторов.
public EffectOptions ( params object [ ] options )
public EffectOptions ( IEnumerable<object> options )
public EffectOptions ( string name )
public EffectOptions ( object owner )
public EffectOptions ( int count )
public EffectOptions ( Point point )
Затем устраните все неприменимые конструкторы. Применимый конструктор - это тот, где каждый формальный параметр имеет соответствующий аргумент, а аргумент неявно конвертируется в формальный тип параметра. Предполагая, что Точка является типом значения, мы исключаем версии "int" и "Point". Это оставляет
public EffectOptions ( params object[] options )
public EffectOptions ( IEnumerable<object> options )
public EffectOptions ( string name )
public EffectOptions ( object owner )
Теперь мы должны рассмотреть вопрос о том, применим ли тот, у кого есть "params" в его расширенной или нерасширенной форме. В этом случае это применимо в обеих формах. Когда это произойдет, мы отбрасываем развернутую форму. Таким образом, листья
public EffectOptions ( object[] options )
public EffectOptions ( IEnumerable<object> options )
public EffectOptions ( string name )
public EffectOptions ( object owner )
Теперь мы должны определить лучших кандидатов. Правила бестселлера сложны, но короткая версия - это более конкретная, чем менее конкретная. Жираф более специфичен, чем млекопитающее, млекопитающее более специфично, чем животное, животное более конкретное, чем объект.
"Объектная" версия менее конкретна, чем все из них, поэтому ее можно устранить. Версия IEnumerable<object>
менее специфична, чем версия object[]
(вы видите, почему?), Поэтому ее можно также устранить. Это оставляет
public EffectOptions ( object[] options )
public EffectOptions ( string name )
И теперь мы застряли. объект [] не более или менее специфичен, чем строка. Поэтому это дает ошибку неоднозначности.
Это всего лишь краткий эскиз; реальный алгоритм tiebreaking намного сложнее. Но это основы.