Sobes.tech
Middle
113
questionbank

Можно ли ограничить типы, которые пользователь будет передавать через шаблон в C#?

Answer from AI

sobes.tech AI

Да, используя ограничения универсальных типов (generic constraints).

public class MyGenericClass<T> where T : IMyInterface // T должен реализовывать IMyInterface
{
    // ...
}

public class AnotherGenericClass<T> where T : class // T должен быть ссылочным типом
{
    // ...
}

public class YetAnotherGenericClass<T> where T : struct // T должен быть значимым типом
{
    // ...
}

public class CombinedConstraints<T> where T : MyBaseClass, new(), IDisposable // Комбинированные ограничения
{
    // ...
}

Виды ограничений:

  • where T : struct: Тип должен быть значимым (не nullable).
  • where T : class: Тип должен быть ссылочным.
  • where T : new(): Тип должен иметь публичный параметрless конструктор. Это ограничение не может использоваться с struct и class одновременно.
  • where T : BaseClass: Тип должен наследоваться от BaseClass или быть самим BaseClass.
  • where T : IInterface: Тип должен реализовывать интерфейс IInterface.
  • where T : U: Тип T должен быть или наследоваться от типа U, где U - другой параметр типа.

Можно комбинировать несколько ограничений, разделяя их запятой. Ограничения на базовый класс или интерфейс должны указываться первыми.