В обсуждении моего ответа на вопрос возник один спорный момент.
Допустим имеем обобщенный класс и три метода в нем:
class SomeClass
Собственно вопрос - является ли не обобщенный метод, с параметром обобщенного типа класса, обобщенным методом?
Ответ
Всё же, как вы догадались, ответ необобщённый (non-generic). Потому что есть определение, что такое обобщённый метод и всё.
Метод считается обобщённым, когда у него есть свой параметр типа. Если у него его нет, то это необобщённый метод.
У обобщённого типа метод может заимствовать параметр типа для возвращаемого значения и/или для типа параметра (не путайте тип параметра с параметром типа, хотя этот каламбур, наверняка, наводит путаницу), но это не сделает его обобщённым, если у метода нету своего параметра типа
И ваши исследования генерируемого IL совершенно не противоречат мои доводам.
Но я бы всё равно не смешивал терминологию языка программирования и детали его реализации. Я не считаю это корректным.
Подкину тему для размышлений: иногда невиртуальные методы вызываются как виртуальные. Просто генерируется инструкция callvirt в некоторых случаях для невиртуальных методов и всё. Можно было бы также спросить "Может их следует называть неявно виртуальные?" (Но тут скорей очевидно, что это просто делать реализации).
Смущение для разработчиков
Но для начинающих (и не только) разработчиков — это, по крайней мере поначалу, странно. К примеру, все привычные члены Dictionary необобщённые: Add(TKey, TValue), ContainsKey(TKey), TryGetValue(TKey, TValue), Remove(TKey) и т.д.. И это многих удивляет, даже иногда тех, кто пользовался годами этим словарём. Тип обобщённый, но методы — нет. У List дела обстоят интересно: у него только один обобщённый метод ConvertAll
Комментариев нет:
Отправить комментарий