One of the features that C sharp, like any other Object-riented Programming languages prides itself in is it’s support for Inheritance.  Inheritance allows the expression of reusability with a base type. Reusability is a requirement to software these days as the cost of software is still sky high. However in C sharp, there is another way for writing re-usable code. That is generics. Generics express reusability through a template that contains place-holder types. Generics have the advantage of increasing type safety and reducing casting and boxing.

 

Delve into .net base class libraries and you will find countless usage of generic classes, interfaces, structures, delegates and methods.
Generic Types
A generic type declares type parameters that will be filled with the consumer of the generic type. That consumer has to respect those placeholder types, otherwise the compiler throws an error. For example, you can create a Stack collection type and specify the generic parameter as T. That will force the consumer of the collection to stack only instances of type T. The T is formally called type parameter. You can also call it placeholder. It will be place inside a pair of angle brackets.
Here is a simple documentary explaining Generics in a fun way:
https://youtu.be/-ESpTidI5rA