委托的协变和逆变

Covariance and Contravariance of Delegates

关于 delegatescovariancecontravariance 我有些不理解。向下转换参数和向上转换 return 类型

的灵​​活性背后的基本原理是什么

举个例子,假设我们有

  1. Person 作为超类,Teacher 作为 Person 的子类
  2. 代表return人
  3. 的方法的 ReturnPersonDelagate
  4. TeacherParameterDelegate,表示以雇员对象为参数的方法

你可以

  1. 将 return 教师的方法分配给 ReturnPersonDelagate(向上转换)
  2. 分配一个以Person为参数的方法TeacherParameterDelegate(向下转型)

我有点困惑。这个概念背后的基本原理是什么?为什么暗中支持向下转换?

这很有道理。看一看:

public class Program
{
    public static void Main()
    {
        Del d = Method;
        var p = d(new Teacher());
    }

    public delegate Person Del(Teacher t);

    public static Teacher Method(Person p)
    {
        return new Teacher();
    }
}

public class Person {}
public class Teacher : Person {}

Method returns 一个 Teacher 对象,它始终是 Person 类型,但假设您交换类型并使 Del return 是更具体的类型,Method 到 return 是更通用的类型。该代码将不起作用,并且根本没有意义。但在这种情况下,它总是得到一个可以隐式转换为 Del 的 return 类型的正确类型。此外,Del 类型的参数类型比 Method 接受的参数类型更具体,因为它也有意义。例如,如果您要交换它们,您可以使用不正确的类型调用 Method,但在这种情况下,这很好,因为 Teacher 对象将始终为 Person.[=22 类型=]