Обобщения (generics) позволяют писать классы и методы, параметризованные типом, обеспечивая безопасность типов и переиспользуемость без дублирования кода и явного приведения типов. Ограничения (constraints) ограничивают, какие типы может принимать параметр обобщения, позволяя безопасно использовать члены этих типов. Обобщения широко распространены в C# (вся библиотека коллекций их использует).
Проблема, которую решают обобщения
=> arr[i];
=> arr[i];
x = Get([] { , , }, );
