.NET Generics has wide vareity of applications, from generic collection classes to custom user created collection classes.
An object based collection has boxing/unboxing overhead for value types, casting overhead for reference type this means type safety can be compromised & may be runtime exceptions will happen. Writing a collection class for every type will lead to lesser productivity. In Non-generic list value types needs to be boxed & reference types needs to be casted hitting performance. Also accidentallly unwarranted type can enter in to list throwing runtime exception because weekly typed it is. A generic class can defer specification of one more types until it is instantiated. (For example a generic type T may be an int or string)
An object based collection has boxing/unboxing overhead for value types, casting overhead for reference type this means type safety can be compromised & may be runtime exceptions will happen. Writing a collection class for every type will lead to lesser productivity. In Non-generic list value types needs to be boxed & reference types needs to be casted hitting performance. Also accidentallly unwarranted type can enter in to list throwing runtime exception because weekly typed it is. A generic class can defer specification of one more types until it is instantiated. (For example a generic type T may be an int or string)
Generics after compiling in CIL it will contain only type value parameters. But during compilation by CLR to create instance of generic class, the handling is different for value type and reference type. For value type for every distinct type T a generic specialized class will be created with proper substitutions. For example for int & long, separately substituted two generic specialized class will be created. For reference types things are different. On encountering usage of first reference type a single specialized generic type will be created substituting object pointers. For example customer, order classes will be instances of same substituted specialized generic type. This reduces code bloating instead of a class for every Type, same generalized substituted Type class is re-used.
Default keyword will be used like default