2010-08-25 63 views

回答

4

有2個原因,這是行不通的:

  • IEnumerable<T>是協變(現聲明public interface IEnumerable<out T>),但IList<T>不是。否則,你將能夠做這樣的事情:

    IList<string> listOfStrings = ... 
    IList<object> listOfObjects = listOfStrings; 
    listOfObjects.Add(42); // would fail at runtime because it is actually a list of strings, not ints 
    
  • 協方差和逆變只有在接口上工作,而不是在具體的類

From MSDN

在.NET Framework版本4,變體類型參數僅限於通用接口和泛型委託類型。

2

由於列表{T}類型爲invariant,因此在第二種情況下可以這樣做:

List<object> lst = new List<string>(); 
lst.Add(10); 

這是無效的,因爲您要將Int32添加到字符串列表中。

IEnumerable {out T}類型與'out'所暗示的協變。這意味着它不可能添加項目,只能從項目中獲取項目,這使得第一條語句有效。

然而,這是有效的:

List<object> lst = new List<object>(); 
lst.AddRange(new string[] { "hello" }); 
相關問題