CSharp - Generic Type Parameters

Introduction

Type parameters can be introduced to a type by classes, structs, interfaces, delegates, and methods.

Other constructs, such as properties and indexer, cannot introduce a type parameter but can use one.

For example, the property Value uses T:

struct Nullable<T>
{
       public T Value { get; }
}

A generic type or method can have multiple parameters. For example:

class HashTable<TKey, TValue> {
}

To instantiate:

HashTable<int,string> myDic = new HashTable<int,string>();

Or:

var myDic = new HashTable<int,string>();

Generic type names and method names can be overloaded as long as the number of type parameters is different.

For example, the following three type names do not conflict:

class A{
}
class A<T>{
}
class A<T1,T2> {
}