Страницы

Поиск по вопросам

четверг, 28 ноября 2019 г.

Почему вызывается перегруженный метод?

#c_sharp #c_sharp_faq


static void Main(string[] args)
{
     object s = A(null);
}

static object A(object s) { return s; }

static object A(string s) { return s; }


Вопрос состоит в следующем: 


Почему, вызывается метод с string'овым входным параметром? 
Почему, не вызывается метод с входным параметром object? 


Где можно по этому поводу найти информацию?
    


Ответы

Ответ 1



Во-первых, компилятор смотрит, какие метод вообще могут быть вызваны. Предположим, у вас три перегрузки: static object A(object s) { return s; } static object A(string s) { return s; } static object A(int s) { return s; } При вызове A(null) компилятор будет рассматривать только первые две перегрузки, потому что null не является валидным значением для типа int. А при вызове A(42) компилятор будет рассматривать только первую и третью перегрузки, потому что 42 не является валидным значением для типа string. Во-вторых, из подходящих методов компилятор выберет тот метод, которые имеет наиболее конкретный тип. В данном случае это string. Таким же принципом "ближе -- лучше" компилятор руководствуется, например, и при выборе методов между текущим и родительским классом. Подробную информацию можно найти в спецификации. Также есть краткие статьи на тему перегрузок от Джона Скита и Эрика Липперта.

Комментариев нет:

Отправить комментарий