我正在查看有关委托参数兼容性的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
}
}
答案 0 :(得分:4)
将object
(函数ActionObject
的参数)投影到为委托(string
)声明的类型是逆变的。
这是允许的,因为通过传递一个字符串(你必须由于委托签名),你可以保证你将有一个object
(分配的函数需要),所以一切都很好,安全
您也知道,“普通多态”在此上下文中实际上称为协方差。
有关详细信息,请参阅MSDN。
答案 1 :(得分:3)
函数类型在参数类型中是逆变的。在您的示例中键入
delegate void ObjectAction(object o);
是
的子类型delegate void StringAction(string s);
因为ObjectAction
可以在任何使用StringAction
的地方使用,因为如果调用者传入string
参数,则参数也必须是object
类型。
object
是string
的超类型,但ObjectAction
是StringAction
的子类型;子类型方向相反。这就是它被称为逆变的原因。因为函数子类型的变化与参数子类型的方向相反。