// 协变性。
IEnumerable< string> strings = new List< string>();
// 参数类型派生程度较大的实例化对象
IEnumerable< string> strings = new List< string>();
// 参数类型派生程度较大的实例化对象
// 分配给参数类型派生程度较小的对象引用。
// 分配兼容性被保留。
IEnumerable< object> objects = strings;
// 逆变性。
// 假定我们有这么个方法:
// static void SetObject(object o) { }
Action< object> actObject = SetObject;
// 参数类型派生程度较小的实例化对象
IEnumerable< object> objects = strings;
// 逆变性。
// 假定我们有这么个方法:
// static void SetObject(object o) { }
Action< object> actObject = SetObject;
// 参数类型派生程度较小的实例化对象
// 分配给参数类型派生程度较大的对象引用。
// 分配兼容性被反转。
Action< string> actString = actObject;
Action< string> actString = actObject;