It denotes a covariant parameter. See also the description on MSDN. Essentially it says, that IGrouping<Aderived, Bderived>
can be regarded as IGrouping<Abase, Bbase>
, hence you can
IGrouping<Aderived, Bderived> gr = MakeGrouping(...);
IGrouping<Abase, Bbase> grBase = gr;
if Aderived
is an interface or a type derived from Abase
. This is a feature that comes in handy when you want to call a method that requires a parameter of type IGrouping<Abase, Bbase>
, but you only got an object of type IGrouping<Aderived, Bderived>
. In this case, both types can be considered equivalent due to the covariance of their type parameters.