所以我知道你的问题在哪里。答案应该是这样。让我再次使用MSDN 中的示例:static object GetObject() { return null; } static void SetObject(object obj) { } static string GetString() { return ""; } static void SetString(string str) { } static void Test() { // Covariance. A delegate specifies a return type as object, // but you can assign a method that returns a string. Func<object> del = GetString; // Contravariance. A delegate specifies a parameter type as string, // but you can assign a method that takes an object. Action<string> del2 = SetObject; //However you can't use del2 this way, after this assingment: //del2(new object);} 这很难理解,对我来说它是安静的高级抽象。协方差让我们仔细看看Func<object> del = GetString; 你被允许做这样的事情,因为字符串派生自对象,所以只要你得到一个返回类型派生自对象的方法,你就没有问题。想象一下,您声明了相同的 del,因此您所知道的将获得对象,因此您声明了一个变量:object returnedType = del2();您不必关心 del2 是返回 int 还是 string,因为它们派生自 object 它将类似于: object returnedType = "string"; //Here we know what is on the left side //If we assign to del2 method with return type string.逆变现在让我们看看Action<string> del2 = SetObject; 现在你假设你会得到一个字符串来方法,所以如果有人,有一天会使用你的委托和方法,就像SetObject(object obj)之前一样:object obj= "string"; //Here we know what is on the right假设这都是关于纯多态性的。在协方差中,我们排除了一种通用类型,但如果我们获得更具体的类型,它不会对我们产生任何改变。逆变我们知道我们将传递什么,但我们是否将字符串分配给字符串或字符串分配给对象并不重要。(但我们不能将对象分配给字符串)。