2012-10-01 41 views
1

看着这个代码逆变和方法签名?

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

+1

你的第二点是有关逆变服用。 – Jodrell

+0

@Jodrell为什么?你可以在接受动物的方法上执行dowork(myHorse).....而我不是在谈论委托人....只是正常的方法 –

+0

但那是因为方法调用是逆变的,我们习惯了它。它使多态性的工作。 – Jodrell

回答

3

此代码执行像ActOnObject (object o)的方法的工作原理,因为正如埃里克利珀在this article中说:

委派转换的方法组是逆变的在他们的 参数类型。

以上仅适用于参考类型,但stringobject均为参考类型,所以满足要求。

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

+0

你是在告诉我这是因为两个原因吗? –

+0

从技术上讲,它的工作原因是第二个原因,但这仍然是一种逆转形式。 –

+0

多数民众赞成更喜欢它 - 第二个原因。所以与逆变没有关系......?如果这个代码在2005年运行(fw2),它会继续工作吗? (我没有测试) –