我想在C#中做一些像co-variance这样的事情,但我没有这里的任何继承。
我有这段代码:
public interface IBirthday
{
void Dance ();
}
public class Birthday:IBirthday
{
public void Dance()
{}
}
void Main()
{
List<Birthday> l= new List<Birthday>();
List<IBirthday> d = l; //<--- How can I accomplish that ?
}
我可以做这个工作吗? (除了手动迭代和构建(linq或循环))
List<IBirthday> d = list of birthdays ?
迭代/ linq是唯一的选择吗?
答案 0 :(得分:6)
可能将List<Birthday>
分配给List<IBirthday>
而不创建全新的列表(它可能对您隐藏,但必须发生在某处。)
如果您尝试做的事情是可能的,那么当有人做了什么时会发生什么:
public class UnBirthday : IBirthday { ... }
d.Add(new UnBirthday());
嗯,它是List<IBirthday>
,所以它认为它能够添加新项目。但是基础列表实际上是List<Birthday>
,您无法在该列表中添加UnBirthday
。考虑到在允许这种情况和在运行时崩溃之间的选择,C#做出了决定(正确地,在我看来),首先不允许它。
利用泛型参数协方差的唯一方法就是将其分配给只能读出信息的东西,而不是将信息输入。这样做的一个例子是{{1} }。每个IEnumerable<T>
都是Birthday
,IBirthday
无法获得IEnumerable
IBirthday
,所以说:
Birthday
工作正常。
答案 1 :(得分:3)
您可以使用:
d = l.Cast<IBirthday>.ToList();