逆变和方法签名?

时间:2012-10-01 10:13:08

标签: c# .net covariance contravariance

查看此代码

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")

2 个答案:

答案 0 :(得分:3)

此代码有效,因为正如Eric Lippert在this article中所说:

  

委派转化的方法组在其中是逆向的   参数类型。

以上仅适用于参考类型,但stringobject都是引用类型,因此满足要求。

自C#2.0以来,我们一直支持这种差异,您不需要第4版中引入的额外支持来依赖它。

答案 1 :(得分:0)

是的,这是由于逆变。

  

这意味着您不仅可以为代理分配具有的方法   匹配签名,以及返回更多派生类型的方法   (协方差)或接受具有较少派生类型的参数   (逆变),而不是代表类型指定的。

取自http://msdn.microsoft.com/en-us/library/dd233060(VS.100).aspx