MSDN: 将方法签名与委托类型匹配时,协变和逆变为您提供了一定程度的灵活性。协变允许方法具有的派生返回类型比委托中定义的更多。逆变允许方法具有的派生参数类型比委托类型中的更少。 父类及子类: class BaseClass { public string ID { get; set; } } class MyClass : BaseClass { public string Dec { get; set; } } 主函数: class Program { //协变 public delegate BaseClass TestMethod1(); //逆变 public delegate string TestMethod2(MyClass bc); //协变与逆变 public delegate BaseClass TestMethod3(MyClass bc); static void Main(string[] args) { //当委托方法(Test1)的返回类型(MyClass)直接或间接继承自委托签名(TestMethod1)的返回类型(BaseClass)时,就称为协变委托方法。 //因为委托方法(Test1)的返回类型(MyClass)可以隐式转换为委托签名(TestMethod1)的返回类型(BaseClass)。这样该方法就可用作委托。 TestMethod1 tm1 = new TestMethod1(Test1); BaseClass c1 = tm1(); //当委托签名(TestMethod2)的参数类型(MyClass)继承自委托方法(Test2)参数类型(BaseClass)时,就称为逆变委托方法。 //因为在调用委托(TestMethod2)时可以隐式将传递的参数类型(MyClass)转换为委托方法(Test2)所需的参数类型(BaseClass)。 TestMethod2 tm2 = new TestMethod2(Test2); string c2 = tm2(new MyClass()); //在调用委托(TestMethod3)时可以隐式将传递的参数类型(MyClass)转换为委托方法(Test3)所需的参数类型(BaseClass)。 //委托方法(Test3)的返回值(MyClass)可以隐式转换(BaseClass)。 TestMethod3 tm3 = new TestMethod3(Test3); BaseClass c3 = tm3(new MyClass()); } private static MyClass Test1() { MyClass c = new MyClass(); c.ID = "1"; return c; } private static string Test2(BaseClass mc) { return "Hello"; } private static MyClass Test3(BaseClass mc) { MyClass c = new MyClass(); c.ID = "1"; return c; } } 协变主要针对委托的返回值,委托方法的返回值必须是委托签名返回值的子集。 逆变主要针对委托的参数类型,委托方法的参数类型必须是委托签名的参数类型的父集。