Страницы

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

четверг, 4 октября 2018 г.

Generic или не Generic

В обсуждении моего ответа на вопрос возник один спорный момент.
Допустим имеем обобщенный класс и три метода в нем:
class SomeClass { //не обобщенный метод public void DoSomething(int x) { Console.WriteLine("True non generic method"); } //не обобщенный метод с параметром обобщенного типа класса public void DoSomething(T x) { Console.WriteLine("Indirectly generic method"); } //явно обобщенный метод public void DoSomething(U x) { Console.WriteLine("True generic method"); } }
Собственно вопрос - является ли не обобщенный метод, с параметром обобщенного типа класса, обобщенным методом?


Ответ

Всё же, как вы догадались, ответ необобщённый (non-generic). Потому что есть определение, что такое обобщённый метод и всё.
Метод считается обобщённым, когда у него есть свой параметр типа. Если у него его нет, то это необобщённый метод.
У обобщённого типа метод может заимствовать параметр типа для возвращаемого значения и/или для типа параметра (не путайте тип параметра с параметром типа, хотя этот каламбур, наверняка, наводит путаницу), но это не сделает его обобщённым, если у метода нету своего параметра типа
И ваши исследования генерируемого IL совершенно не противоречат мои доводам. Но я бы всё равно не смешивал терминологию языка программирования и детали его реализации. Я не считаю это корректным.

Подкину тему для размышлений: иногда невиртуальные методы вызываются как виртуальные. Просто генерируется инструкция callvirt в некоторых случаях для невиртуальных методов и всё. Можно было бы также спросить "Может их следует называть неявно виртуальные?" (Но тут скорей очевидно, что это просто делать реализации).

Смущение для разработчиков
Но для начинающих (и не только) разработчиков — это, по крайней мере поначалу, странно. К примеру, все привычные члены Dictionary необобщённые: Add(TKey, TValue), ContainsKey(TKey), TryGetValue(TKey, TValue), Remove(TKey) и т.д.. И это многих удивляет, даже иногда тех, кто пользовался годами этим словарём. Тип обобщённый, но методы — нет. У List дела обстоят интересно: у него только один обобщённый метод ConvertAll(Converter), остальные — нет.

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

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