2011-06-03 19 views
0

我已閱讀了良好的文章引入協方差和contracovariance關於產品在方法中使用的逆變參數參數

http://bartdesmet.net/blogs/bart/archive/2009/04/15/14377.aspx

反變參數應只發生在輸入的位置:方法的參數,設定唯一屬性或索引。

class SubClass : BaseClass { 
    public void PrintSubClass() {} 
} 
class BaseClass{ 
} 

static class Sample { 

    public static void PrintMeNow (SubClass c) 
    { 
     c.PrintSubClass(); 
    } 
} 

static void Main(string[] args) 
{ 
    SubClass sc = new SubClass(); 
    BaseClass bc = new BaseClass(); 

    Sample.PrintMeNow(sc); // ok 
    Sample.PrintMeNow(bc); // Line A (not-ok Question: Is this contravariance?) 
} 

根據我的逆變的理解,我已經把代碼如上。 顯然,A行不正確,我誤解了逆轉的概念。

哪部分是錯誤的?什麼概念沒有正確理解?如何使它正確?

回答

2

協方差和反變量與通用參數有關;你的代碼與它無關。

它不起作用,因爲bc不是​​。
所有​​ES是BaseClass上課,但不是所有的BaseClass ES是​​ES。

+0

@Slakes,從上面的網址「換句話說,我們正在以更派生類型事件參數,但我們把它作爲少的。作爲參數出現在輸入位置,這樣做是安全的」。這是讓我很困惑的地方。在那裏,我們可以將具有基類簽名的方法分配給具有派生類簽名的另一個方法。 – q0987 2011-06-03 21:57:21

+1

換句話說,他在需要基類型的地方傳遞派生類型。這與你正在做的事情相反。 – SLaks 2011-06-03 22:04:49

+0

具體而言,他將'ProgressEventArgs'作爲'EventArgs'傳遞。 – SLaks 2011-06-03 22:10:38

相關問題