查看此代码
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")
答案 0 :(得分:3)
此代码有效,因为正如Eric Lippert在this article中所说:
委派转化的方法组在其中是逆向的 参数类型。
以上仅适用于参考类型,但string
和object
都是引用类型,因此满足要求。
自C#2.0以来,我们一直支持这种差异,您不需要第4版中引入的额外支持来依赖它。
答案 1 :(得分:0)
是的,这是由于逆变。
这意味着您不仅可以为代理分配具有的方法 匹配签名,以及返回更多派生类型的方法 (协方差)或接受具有较少派生类型的参数 (逆变),而不是代表类型指定的。
取自http://msdn.microsoft.com/en-us/library/dd233060(VS.100).aspx