Перегрузка функции C # не бросает ошибку компиляции [дубликат]

Правильный способ сделать это - создать динамический хост с add_host и поместить его в новую группу, а затем запустить новую игру, предназначенную для этой группы. Таким образом, если у вас есть другие ключи подключения, которые необходимо установить заранее (учетные данные / ключи / etc), вы можете установить их в пустой группе в инвентаре, а затем добавить хост к ней динамически. Например:

- hosts: localhost
  gather_facts: no
  vars_prompt:
  - name: target_host
    prompt: please enter the target host IP
    private: no
  tasks:
    - add_host:
        name: "{{ target_host }}"
        groups: dynamically_created_hosts

- hosts: dynamically_created_hosts
  tasks:
  - debug: msg="do things on target host here"
31
задан Joan Venge 2 March 2011 в 21:56
поделиться

2 ответа

Для точных правил см. спецификацию разрешения перегрузки . Но вкратце, это происходит следующим образом.

Сначала создайте список всех доступных конструкторов .

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 намного сложнее. Но это основы.

69
ответ дан reinierpost 21 August 2018 в 22:35
поделиться
  • 1
    Спасибо Эрику, оцените ответ. Я не совсем уверен, почему объект [] более специфичен, чем IEnumerable & lt; object & gt ;. Это потому, что IEnumerable использует дженерики? – Joan Venge 3 March 2011 в 00:33
  • 2
    @Joan: Каждый жираф - это животное, но не каждое животное - жираф. Поэтому жираф более специфичен, чем животное. Каждый объект [] является IEnumerable & lt; object & gt ;, но не каждый IEnumerable & lt; object & gt; является объектом []. Поэтому объект [] более специфичен, чем IEnumerable & lt; object & gt ;. – Eric Lippert 3 March 2011 в 00:49
  • 3
    Спасибо Эрик, я так и не думал об этом. – Joan Venge 3 March 2011 в 01:01

В этом случае компилятор C # не будет выбирать какой-либо конструктор и вместо этого будет ошибкой. Значение null является законным для нескольких доступных конструкторов, и для выбора одного из них недостаточно логики разлома, поэтому он вызывает ошибку.

Логика разрешения перегрузки компилятора C # представляет собой сложный процесс, но короткий (и по сути неполный) обзор того, как он работает, выглядит следующим образом

  • Соберите всех членов с данным именем
  • Отфильтруйте элементы с теми, у кого есть списки параметров, которые совместимы с предоставленными аргументами и с соответствующей доступностью
  • . Если остальные члены имеют более одного элемента, используйте логику разломов для выбора лучшие из них

. Полные данные перечислены в разделе 7.4 спецификации языка C #. И я уверен, что Эрик скоро отправится, чтобы дать гораздо более точное описание :)

7
ответ дан JaredPar 21 August 2018 в 22:35
поделиться
  • 1
    – Joan Venge 2 March 2011 в 22:04
  • 2
    @Joan, я имею в виду, что в моем сводке 3-го элемента не содержится много мелких деталей, присущих разрешению перегрузки: операторы, имя + необязательное разрешение аргументов, проблемы с переопределениями против нового и т. Д. Спецификация C # lang имеет полную информацию (и занимает около 4-5 страниц, чтобы объяснить все это). – JaredPar 2 March 2011 в 22:06
  • 3
    Спасибо Джареду, когда он прочитает его снова, я вижу смысл. – Joan Venge 2 March 2011 в 22:06
Другие вопросы по тегам:

Похожие вопросы: