委托逆变(参数兼容性)

本文关键字:参数 兼容性 | 更新日期: 2023-09-27 18:22:02

我正在查看C# 5 in a Nutshell文本,关于委托参数兼容性的部分。它说

调用方法时,可以提供具有比该方法的参数更具体的类型的参数。这是普通的多态行为。出于完全相同的原因,委托可以具有比其方法目标更具体的参数类型。这称为逆变

这一段直到最后的判决都是有意义的。为什么是逆变,即这里的什么投影是逆变的?

下面给出了以下示例。

delegate void StringAction (string s);
class Test
{
    static void Main()
    {
        StringAction sa = new StringAction (ActOnObject);
        sa ("hello");
    }
    static void ActOnObject (object o)
    {
        Console.WriteLine (o); // hello
    }
}

委托逆变(参数兼容性)

object(

函数ActionObject的参数(到为委托(string(声明的类型是逆变的。

这是允许的,因为通过向它传递一个字符串(由于委托签名,您必须这样做(,可以保证您将有一个object(分配的函数采用(,因此一切都很好且安全。

正如您所知,在这种情况下,"普通多态性"实际上称为协方差

有关更多详细信息,请参阅 MSDN

函数类型在参数类型中是逆变的。在您的示例中,类型

delegate void ObjectAction(object o);

delegate void StringAction(string s);

由于ObjectAction可以在使用StringAction的任何地方使用,因为如果调用方传入string参数,则该参数也必须是类型 object

objectstring的超型,但ObjectActionStringAction的子型;子型的方向相反。这就是为什么它被称为逆变。因为函数子类型的变体与参数子类型的方向相反。