How .NET generics work?