代表逆转(参数兼容性)

时间:2014-09-16 00:26:58

标签: c# c#-5.0

我正在查看有关委托参数兼容性的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
    }
}

2 个答案:

答案 0 :(得分:4)

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

这是允许的,因为通过传递一个字符串(你必须由于委托签名),你可以保证你将有一个object(分配的函数需要),所以一切都很好,安全

您也知道,“普通多态”在此上下文中实际上称为协方差

有关详细信息,请参阅MSDN

答案 1 :(得分:3)

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

delegate void ObjectAction(object o);

的子类型
delegate void StringAction(string s);

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

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