1

我想在 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 是唯一的选择吗?

4

2 回答 2

6

在不创建全新列表的情况下,不可能将 a 分配给List<Birthday>a (它可以对您隐藏,但它必须发生在某个地方)。List<IBirthday>

如果您尝试做的事情是可能的,那么当有人这样做时会发生什么:

public class UnBirthday : IBirthday { ... }

d.Add(new UnBirthday());

嗯,它是一个List<IBirthday>,所以它认为它能够添加新项目。但基础列表实际上是 a List<Birthday>,您不能将 a 添加UnBirthday到该列表中。考虑到允许这个和只是在运行时崩溃之间的选择,C# 做出了决定(在我看来是正确的),首先不允许它。

使用泛型参数协方差的唯一方法(您正在尝试做的事情)是将其分配给只能读取信息而从不输入信息的东西。其中一个例子是IEnumerable<T>. 每一个单曲Birthday都是一个IBirthday,没有办法IEnumerable得到一个IBirthday不是一个Birthday,所以说:

List<Birthday> l= new List<Birthday>();
IEnumerable<IBirthday> d = l;

工作得很好。

于 2012-12-17T20:39:53.867 回答
3

您可以使用:

d = l.Cast<IBirthday>.ToList();
于 2012-12-17T20:32:01.893 回答