如果這增加的.Net Framework 4中的Covariant類型參數使我能夠進行分配,看起來像多態性爲什麼協變類型參數不允許我寫[列表<object> lst =新列表<string>()]?
爲什麼我可以寫
IEnumerable<object> lst = new List<string>();
我不能寫
List<object> lst = new List<string>();
如果這增加的.Net Framework 4中的Covariant類型參數使我能夠進行分配,看起來像多態性爲什麼協變類型參數不允許我寫[列表<object> lst =新列表<string>()]?
爲什麼我可以寫
IEnumerable<object> lst = new List<string>();
我不能寫
List<object> lst = new List<string>();
有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
協方差和逆變只有在接口上工作,而不是在具體的類
在.NET Framework版本4,變體類型參數僅限於通用接口和泛型委託類型。
由於列表{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" });