Как компилятор выбирает, какой метод вызывать, когда тип параметра неоднозначен? - PullRequest
8 голосов
/ 23 апреля 2010

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

    [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 ()", вывод на консоль будет "Foo - string".Как компилятор решает, какой метод вызывать?

1 Ответ

16 голосов
/ 23 апреля 2010

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

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...