В C# **обобщённые типы** (generics) позволяют определять классы, структуры, интерфейсы и методы с параметрами типа, что повышает гибкость и повторное использование кода.
### Открытый обобщённый тип (open generic type):
Это обобщённый тип, который **ещё не был конкретизирован**, то есть его параметры типа не были определены. Например:
```csharp
public class List<T>
{
// Открытый обобщённый тип, T ещё не задан
}
```
Такой класс нельзя использовать напрямую, потому что параметр типа T ещё не был определён. Открытые обобщённые типы полезны для создания гибких и многократно используемых классов и методов, которые могут работать с разными типами данных.
### Закрытый обобщённый тип (closed generic type):
Это обобщённый тип, у которого **все параметры типа конкретизированы** (заданы определённые типы). Например:
```csharp
List<int> intList = new List<int>();
```
Здесь `List<int>` — это закрытый обобщённый тип, где параметр типа `T` был заменён на конкретный тип `int`. Теперь этот тип можно использовать, так как все параметры обобщённого типа указаны.
Закрытые обобщённые типы используются в процессе выполнения программы, когда нужно работать с конкретными типами данных.
### Несвязанный обобщённый тип (Unbound generic type)
**Unbound generic type** — это тип, который представляет собой шаблон (template) без конкретных аргументов типов. Он используется для создания ссылок на сам тип с обобщением, но без указания того, какие именно типы будут подставлены вместо его параметров.
Например, в C# обобщенный класс `List<T>` может быть использован как **unbound generic type**, если указать только имя класса без типа аргумента:
```csharp
Type listType = typeof(List<>);
```
В данном случае `List<>` — это **unbound generic type**, так как не указан конкретный тип для `T`. Такой тип не может быть напрямую использован для создания экземпляра (нельзя создать объект `new List<>()`), но его можно использовать для рефлексии (reflection) или в специальных случаях, где типы определяются позже.
> Я так понимаю, что суть в том, что если нужно выполнить какую-то проверку между Type и в этой проверке указание дженерикой для типов необязательно, то **Unbound generic type** дает решение.
Пример использования:
```csharp
public void ValidateType(Type type)
{
Type genericType = typeof(IRepository<>);
if (type.IsGenericType && type.GetGenericTypeDefinition() == genericType)
{
// Проверка, что тип реализует обобщённый интерфейс IRepository<T>
}
}
```