查看此代码
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
}
}
这段代码是否由于逆变而起作用?( MoreDeriverdRef <== LessDerivedRef )
或者因为
(与逆变无关) - 在 c# 中,我可以执行类似 ActOnObject (object o)
的方法,ActOnObject ("lalala")
这段代码之所以有效,是因为,正如 Eric Lippert 在本文中所说:
委托转换的方法组在其 参数类型。
以上仅适用于引用类型,但 string
和 object
都是引用类型,因此满足要求。
这种差异从 C# 2.0 开始就得到了支持,你不需要版本 4 中引入的额外支持来依赖它。
是的,这是由于逆变。
这意味着您不仅可以将具有以下方法分配给委托 匹配签名,以及返回更多派生类型的方法 (协方差)或接受派生类型较少的参数 (逆变)比委托类型指定的值。
取自 http://msdn.microsoft.com/en-us/library/dd233060(VS.100).aspx