#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. Таким же принципом "ближе -- лучше" компилятор руководствуется, например, и при выборе методов между текущим и родительским классом. Подробную информацию можно найти в спецификации. Также есть краткие статьи на тему перегрузок от Джона Скита и Эрика Липперта.
Комментариев нет:
Отправить комментарий