2012-08-27 32 views
0

我正在使用.net 3.5框架。下面是 是我的代碼。泛型是用於鍵入sefty?派生類型呢?

class Base {} 

class Derived : Base {} 

class Program { 
    static Main() { 
    IList<Base> base_col = new List<Base>(); 
    base_col.Add(new Derived()); // Do you think this line code is good? 
    } 
} 

你認爲仿製藥將是類型檢查的好主意嗎?

我會走一步。

static Main() { 
    IList<Derived> base_col = new List<Derived>(); 
    Process(base_col); // error. 
} 
static Process(IEnumarable<Base> baseCollection) { } 

爲什麼代碼在這裏打破?

+0

如果你認爲這是有趣的,等到你嘗試一個IList 傳遞給接受一個I​​List

回答

1

由於Derived也是Base,所以顯示的代碼沒有問題 - 而且它與泛型沒有多大關係。

關於編輯:您提供的代碼在.NET 4中工作,其中IEnumerable<>接口是逆變的。以前的版本沒有使用這個特性(支持接口中的協同/衝突顯然是在V2以後的CLR中,但在.NET Framework的V4之前沒有語言使用該特性發布代碼)。

對於這個特定的情況下,你可以使用Cast<> LINQ功能安全,但:

static Main() { 
    IList<Derived> base_col = new List<Derived>(); 
    Process(base_col.Cast<Base>()); 
} 
+0

我完全地方法同意你的...請在上面找到我更新的代碼。 – Prashant

+0

@Prashant,看我的編輯。 – Lucero