Как компилятор выбирает, какой метод назвать, когда тип параметра неоднозначен?

У меня есть следующий код:

    [TestMethod]
    public void TestFoo()
    {
        Foo(null);
    }

    private void Foo (object bar)
    {
        Console.WriteLine("Foo - object");
    }

    private void Foo (string bar)
    {
        Console.WriteLine("Foo - string");
    }

и когда я запускаю тест "TestFoo ()", консольный вывод является "Нечто - строка". Как компилятор решает который метод звонить?

8
задан Darksider 23 April 2010 в 06:31
поделиться

1 ответ

Он применяет правила «лучшего преобразования» (7.4.3.3 C # 3 spec) как часть решения проблемы перегрузки (раздел 7.4.3 в целом).

В основном в этом случае происходит преобразование из строки в объект , но не из объекта в строку . Следуя правилам, это означает, что преобразование из null в строку лучше, чем преобразование из null в объект , поэтому перегрузка с используется параметр строка .

Разрешение перегрузки может стать чрезвычайно сложным, если задействованы следующие факторы:

  • В наборе кандидатов могут быть общие методы
  • Если есть общие методы , вывод типа применяется к каждому из их отдельно, что дает разные возможности преобразования
  • . Если какие-либо аргументы являются группами методов, они могут быть преобразованы в разные типы делегатов - возможно, даже с использованием разных сигнатур методов, если именованная группа методов также имеет несколько перегрузок
  • Наследование может привести к неожиданным результатам
  • Массивы параметров ( params ) добавляют удовольствия
  • Необязательные параметры в C # 4 тоже способствуют принятию решения

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

16
ответ дан 5 December 2019 в 10:40
поделиться
Другие вопросы по тегам:

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