C#2.0中的接口多态性

Tom*_*ing 4 .net c# oop interface .net-2.0

说我有这个界面:

public interface IFoo
{
   string Text {get;}
}
Run Code Online (Sandbox Code Playgroud)

这个实现它的类:

public class Bar : IFoo
{
   public string Text
   {
      get {return "Hello World!";}
   }
}
Run Code Online (Sandbox Code Playgroud)

我有一个函数作为参数a List<IFoo>.当我尝试传递它时List<Bar>,我得到此编译器错误:

Argument 1: cannot convert from System.Collections.Generic.List<Bar>
to System.Collections.Generic.List<IFoo>
Run Code Online (Sandbox Code Playgroud)

为什么是这样?看起来这应该起作用的原因与我传递一个Bar直接继承的类的列表相同.

jas*_*son 10

为什么是这样?看起来这应该起作用的原因与我直接从Bar继承的类的列表一样.

因为这场灾难可能发生:

class EvilBar : IFoo { }

List<Bar> list = new List<Bar>();
List<IFoo> foos = list; // suppose it were allowed
foos.Add(new EvilBar());
Run Code Online (Sandbox Code Playgroud)

而现在你添加的EvilBar列表只能接受Bar.哎呀!

基本上,你发现它T -> List<T>不是协变的T.

  • @linepogl:你在说什么?`IFoo foo = new EvilBar();`非常好.你有没有投票? (2认同)
  • @linepogl:这不是一个直接的比喻.你不能将`EvilBar`添加到`List <Bar>`,这就是为什么我的例子是一场灾难. (2认同)