У меня есть следующий код:
[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 ()", консольный вывод является "Нечто - строка". Как компилятор решает который метод звонить?
Он применяет правила «лучшего преобразования» (7.4.3.3 C # 3 spec) как часть решения проблемы перегрузки (раздел 7.4.3 в целом).
В основном в этом случае происходит преобразование из строки
в объект
, но не из объекта
в строку
. Следуя правилам, это означает, что преобразование из null
в строку
лучше, чем преобразование из null
в объект
, поэтому перегрузка с используется параметр строка
.
Разрешение перегрузки может стать чрезвычайно сложным, если задействованы следующие факторы:
params
) добавляют удовольствия В принципе, перегрузка может быть настоящей банкой червей - где возможно, проектируйте перегрузки так, чтобы только одна из них всегда была допустимой целью для любого заданного вызова метода, чтобы вам не нужно было беспокоиться о подробных правилах.