Covariance and Contravariance deal with the oredering of types from narrower to wider and their interchangeability or equivalence in specific cases.
When a software programming language supports covariance it means that in specific cases (such as function parameters, generics and function returned types) it supports the conversion from a narrower type (e.g. int) to a wider one (e.g. double).
When a software programming language supports contravariant it means that in specific cases (such as function parameters, generics and function returned types) it supports conversion from a wider type (e.g. double) to a narrower one (e.g. int).
C# 4.0 support for covariance allows us to define a delegate with a return type which is wider than the return type of the function we assign to a variable of that specific delegate type. The following video clip shows a small code sample for this capability.
C# 4.0 support for contravariance allows us to define a function with parameters types higher in the hierarchy (wider) comparing with the parameters types (narrower) we include in our definition for the delegate. The following video clip show a small code sample for this capability.