我正在尝试这样做:
List<Parent> test = new List<Child>();
我班的完整代码是:
class Program
{
public static void Main(string[] args)
{
List<Parent> test = new List<Child>();
test.Add(new Child());
test.Add(new AnotherChild());
}
}
class Parent { }
class Child : Parent { }
class AnotherChild : Parent { }
有人可以告诉我为什么这会给我这个错误:
错误2无法将类型'System.Collections.Generic.List'转换为'System.Collections.Generic.List'd:\ personal \ documents \ visual studio 2010 \ Projects \ ConsoleApplication3 \ ConsoleApplication3 \ Program.cs 20 24 ConsoleApplication3
为什么这样做?
Parent[] test = new Child[10];
List<Parent> result = test.ToList();
谢谢:)
- 对:
现在我知道原因:列表编译为List`1
,列表编译为List`2
。他们没有任何关系。
答案 0 :(得分:7)
更新,因为List<Parent>
和List<Child>
这两种类型不是co-variant。
即使您传入的通用参数Child
继承Parent
,该关系也不会进入已关闭的List类型。因此,生成的两个List类型不可互换。
.Net 4.0引入了协方差/反方差。但是,您的代码仍无法使用.Net 4.0,因为List
类或IList
接口都不会更改为共变体。
答案 1 :(得分:3)
您无法执行此操作,因为List<Child>
无法分配给List<Parent>
,即使Child
可分配给Parent
。 List<T>
类型是不变的。
你有什么理由不能使用这样的东西吗?
public static void Main(string[] args)
{
List<Parent> test = new List<Parent>();
test.Add(new Child());
test.Add(new AnotherChild());
}
答案 2 :(得分:1)
使用此
List<Parent> test = new List<Child>().Cast<Parent>().ToList();
答案 3 :(得分:1)
C#中的泛型是不变的,这意味着泛型类型的不同实例之间没有子类型关系。
从概念上讲,List<Child>
不能是List<Parent>
的子类型,因为您可以将AnotherChild
的实例插入List<Parent>
,但不能插入List<Child>
}}
答案 4 :(得分:0)
我告诉你这个artice(它对协方差和逆变有很好的描述。): http://blog.t-l-k.com/dot-net/2009/c-sharp-4-covariance-and-contravariance