interface ICovariant<out T> { }
interface IContravariant<in T> { }
static void Test() {
ICovariant<object> covariantObj;
ICovariant<int> covariantInt = GetCovariant<int>();
covariantObj = covariantInt; // "out T" in ICovariant allows this
IContravariant<object> contravariantObj = GetContravariant<object>();
IContravariant<int> contravariantInt;
contravariantInt = contravariantObj; // "in T" in IContravariant allows this
}