// 协变性。
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;