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.