在C#中列出<Ttype>到List <TInterface>?

Roy*_*mir 1 .net c# interface .net-4.0

我想在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 ? 
}
Run Code Online (Sandbox Code Playgroud)

我可以做这个工作吗?(除了手动迭代和构建(linq或循环))

List<IBirthday> d = list of birthdays ? 
Run Code Online (Sandbox Code Playgroud)

迭代/ linq是唯一的选择吗?

Ser*_*rvy 6

这不是可以指定一个List<Birthday>List<IBirthday>,而无需创建一个全新的列表(可以从你被隐藏,但它必须某处发生).

如果你想要做的事情是可能的,那么当有人这样做时会发生什么:

public class UnBirthday : IBirthday { ... }

d.Add(new UnBirthday());
Run Code Online (Sandbox Code Playgroud)

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

利用泛型参数协方差的唯一方法就是将其分配给只能读出信息的东西,而不是将信息输入.这方面的一个例子是IEnumerable<T>.每一个Birthday都是一个IBirthday,并且没有办法IEnumerable得到一个IBirthday不是一个Birthday,所以说:

List<Birthday> l= new List<Birthday>();
IEnumerable<IBirthday> d = l;
Run Code Online (Sandbox Code Playgroud)

工作得很好.