Как компилятор выбирает перегрузку, когда существует перегрузка с дополнительными параметрами [duplicate]

Для постоянной настройки переменных окружения вы можете использовать одну из существующих ролей в Ansible Galaxy. Я рекомендую franklinkim.environment .

Использование анизотропной галактики:

$ ansible-galaxy install franklinkim.environment

Использование требований.yml:

- src: franklinkim.environment

Затем в вашем плейбуке:

- hosts: all
  sudo: yes
  roles:
    - role: franklinkim.environment
      environment_config:
        NODE_ENV: staging
        DATABASE_NAME: staging

31
задан LarsTech 11 December 2012 в 20:20
поделиться

1 ответ

Хорошо, так как есть общий интерес, вот быстрая версия:

Console.WriteLine (one)

Это будет использовать перегрузку WriteLine(object), которая, в свою очередь, выполнит object.ToString(), переопределенный в One - следовательно, выход ToString override

Console.WriteLine (one.ToString ())

Это будет выглядеть на One и посмотрите, какие методы имеют вновь объявленные методы - переопределение ограничений. Существует только один такой метод, который применим - тот, у которого есть необязательный параметр.

Console.WriteLine (one.ToString («foo»))

То же самое, но это означает, что это выполняется, используя значение по умолчанию, поэтому компилятор не должен использовать значение по умолчанию, следовательно ToString with optional parameter foo

Console.WriteLine (два)

Опять же, это вызовет виртуальный метод object.ToString() из WriteLine(object). Этот метод не был переопределен, поэтому используется реализация по умолчанию, возвращающая имя типа, что приводит к выводу ConsoleApplication1.Test2.

Console.WriteLine (two.ToString ())

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

Метод без параметров считается «лучшим» кандидатом, потому что компилятор предпочитает вызывать метод, который doesn Не нужно заполнять какие-либо дополнительные параметры. Следовательно, вывод ToString new

Console.WriteLine (two.ToString («bar»))

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

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

49
ответ дан Chris 28 August 2018 в 09:59
поделиться
Другие вопросы по тегам:

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