C# 4.0: Covariance And Contravariance In Generics →
Covariant: MyClass<out T>
The ordering of the generic types follows the ordering of the generic type parameters. Generic<T> ≥ Generic<S> for T ≥ S.
A generic type parameter marked with the out keyword can only appear in output positions such as read-only properties and return values.
Contravariant: MyClass<in T>
The ordering of the generic types is reversed from the ordering of the generic type parameters. Generic<T> ≥ Generic<S> for T ≤ S.
A generic type parameter marked with the in keyword can only appear in input positions such as write-only properties and method parameters. Not including ref and out parameters.
Invariant: MyClass<T>
A generic type parameter is invariant if neither of the above apply.