Generic types are one of the cool new features in the .NET 2.0 runtime. Basically they allow you to construct a type passing in a type parameter which customises the generic type on the fly to support that type specifically. A really good example is the generic collection classes like List<T> which allow you to create a list of the specific objects you want to deal with.

When you construct a generic type for a reference type the runtime shares the underlying code base because it is just dealing with pointers anyway – it just makes it look like a different type, however for value types it generates a unique code base for each value type.