2017-02-14 49 views
1

我有下面的代碼,在.NET Framework版本編譯4.0及以上版本:派生清單基地的IEnumerable

public abstract class MyBase { } 
public class MyDerived : MyBase { } 

public abstract class MyBaseCollection<T> : IList<T> where T : MyBase 
{ 
    protected readonly IList<T> deriveds = new List<T>(); 

    public void Test() 
    { 
     // This line works in .NET versions 4.0 and above, but not in versions below. 
     IEnumerable<MyBase> bases = deriveds; 
    } 

    #region IList members with NotImplementedException 
    // ... 
    #endregion 
} 
public class MyDerivedCollection : MyBaseCollection<MyDerived> { } 

但在.NET框架4.0以下我得到下面的行編譯錯誤:

IEnumerable<MyBase> bases = deriveds; 

無法隱式轉換類型 'System.Collections.Generic.IList <牛逼>' 到 'System.Collections.Generic.IEnumerable'。存在明確的轉換(您是否缺少演員?)

問題是在.NET 4.0中對此進行了更改(或已引入)的內容嗎?
有沒有關於這方面的任何文件?

回答

3

在.NET 4.0中的IEnumerable<T>界面是改變。這意味着泛型參數是co-variant,這意味着您可以傳入更多派生類型。

協方差使您能夠使用比原先指定的 更衍生的類型。您可以IEnumerable的 (IEnumerable的(獲得)在Visual Basic)的實例分配給 IEnumerable類型的變量

瞭解更多信息

msdn
2

這是關於收集的協變性和逆變性。檢查以下link以獲取更多信息。

從.NET Framework 4開始,幾個通用接口有 協變類型參數;例如:IEnumerable, IEnumerator,IQueryable和IGrouping。這些接口的所有 類型參數都是協變的,因此類型 參數僅用於成員的返回類型。

public interface IEnumerable<T>

public interface IEnumerable<out T>

注意,這個詞已經被添加到泛型類型參數: