2012-10-01 73 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),它會繼續工作嗎? (我沒有測試) –