Variant types as parameters and return values C# with Example
If a covariant type appears as an output, the containing type is covariant. Producing a producer of Ts is like producing Ts. interface IReturnCovariant { IEnumerable GetTs(); } If a contravariant type appears as an output, the containing type is contravariant. Producing a consumer of Ts is like consuming Ts. interface IReturnContravariant { IComparer GetTComparer(); } If a covariant type appears as an input, the containing type is contravariant. Consuming a producer of Ts is like consuming Ts. interface IAcceptCovariant { void ProcessTs(IEnumerable ts); } If a contravariant type appears as an input, the containing type is covariant. Consuming a consumer of Ts is like producing Ts. interface IAcceptContravariant { void CompareTs(IComparer tComparer); }