Sobes.tech
Middle

Czy można ograniczyć typy, które użytkownik będzie przekazywał przez szablon w C#?

sobes.tech AI

Odpowiedź od AI

Tak, używając ograniczeń typów generycznych (generic constraints).

public class MyGenericClass<T> where T : IMyInterface // T musi implementować IMyInterface
{
    // ...
}

public class AnotherGenericClass<T> where T : class // T musi być typem referencyjnym
{
    // ...
}

public class YetAnotherGenericClass<T> where T : struct // T musi być typem wartości
{
    // ...
}

public class CombinedConstraints<T> where T : MyBaseClass, new(), IDisposable // Połączone ograniczenia
{
    // ...
}

Rodzaje ograniczeń:

  • where T : struct: Typ musi być typem wartości (nie nullable).
  • where T : class: Typ musi być typem referencyjnym.
  • where T : new(): Typ musi mieć publiczny konstruktor bez parametrów. To ograniczenie nie może być używane jednocześnie z struct i class.
  • where T : BaseClass: Typ musi dziedziczyć po BaseClass lub być BaseClass.
  • where T : IInterface: Typ musi implementować interfejs IInterface.
  • where T : U: Typ T musi być lub dziedziczyć po U, gdzie U jest innym parametrem typu.

Można łączyć kilka ograniczeń, oddzielając je przecinkami. Ograniczenia na klasę bazową lub interfejs muszą być podane jako pierwsze.