Generics -Открытые и закрытые построенные типы

Недавно я заметил, что общие построенные типы могут быть открытыми и закрытыми. Но я не понимаю, что они на самом деле означают. Можете ли вы привести простой пример?

На практике терминология на самом деле не имеет большого значения – я не могу вспомнить, в последний раз мне пришлось беспокоиться об этом, кроме как при попытке написать об этом.

  • Тип несвязанного типа не имеет аргументов типа
  • Построенный тип имеет хотя бы один аргумент типа, указанный
  • Параметр типа является открытым типом
  • Тип массива, в котором тип элемента открыт, является открытым типом
  • Открытый построенный тип имеет хотя бы один аргумент типа, который является открытым типом
  • Закрытый тип – это любой тип, который не открыт

(Существуют дополнительные правила для вложенных типов. Обратитесь к разделу 4.4 спецификации C # 3.0 для деталей gory.)

В качестве примера открытого построенного типа рассмотрим:

public class NameDictionary : Dictionary 

Базовым classом typeof(NameDictionary<>) является:

  • Построено, потому что оно задает аргументы типа
  • Открыть, потому что аргумент второго типа ( T ) является открытым типом

Документы MSDN для Type.IsGenericType имеют довольно полезную небольшую таблицу.

Чтобы повторить, это почти совсем не важно в повседневном использовании.

Я вообще за то, что знаю правильную терминологию – особенно для таких вещей, как «пройти по ссылке» и т. Д., Но в этом случае это действительно очень редко. Я хотел бы активно препятствовать вам беспокоиться об этом 🙂

Из MSDN :

Общий тип или метод закрываются, если для всех его параметров типа заменены подлинные типы, включая все параметры типа всех охватывающих типов. Вы можете создать экземпляр типичного типа, если он закрыт.

Таким образом, это работает как List закрывается :

 var list = Activator.CreateInstance(typeof(List)); 

Но это вызывает исключение во время выполнения, потому что List<> открыт :

 var list = Activator.CreateInstance(typeof(List<>)); ↑ 

В большинстве случаев я использовал открытые дженерики (в основном необоснованные дженерики) в сопоставлениях инъекций зависимостей. Например, что-то вроде

 Bind>() .To>() 

Затем, когда мой конструктор объектов содержит:

 public SomethingController(IRepository) { ... } 

Мой механизм инъекции зависимостей автоматически создаст BasicRepository . (Это работает с Ninject и StructureMap и, возможно, с библиотекой Castle Windsor, я не уверен в других фреймворках).

  • Строка parse для enums типа
  • Java: массив примитивных типов данных не автобокс
  • Почему Java Generics не поддерживает примитивные типы?
  • Java Generics: List, List , List
  • Кастинг для общего типа в Java не вызывает ClassCastException?
  • могу ли я отразить типичный тип в java?
  • Доступ к свойствам через параметр Generic type
  • В чем смысл алмазного оператора в Java 7?
  • Что такое «Обычный тип» в контексте семантики перемещения?
  • Преобразование строки в тип с нулевым значением (int, double и т. Д.)
  • Возможна ли неполная запись типа в C #?
  • Давайте будем гением компьютера.