【发布时间】:2018-04-01 11:07:40
【问题描述】:
如果没有显式强制转换,这段代码如何工作?
static void Main()
{
IList<Dog> dogs = new List<Dog>();
IEnumerable<Animal> animals = dogs;
}
我说的是这一行:
IEnumerable<animal> animals = dogs;
您可以在此处看到,我可以在没有显式转换的情况下传递变量 dogs。但这怎么可能?为什么编译器允许我这样做?我不应该先做这样的演员吗:
IEnumerable<Animal> animals = (List<Dog>) dogs;
代码可以在显式转换和不显式转换的情况下工作,但我不明白为什么它允许我在没有显式转换的情况下将狗分配给动物引用变量。
【问题讨论】:
-
请参阅this 关于 IEnumerable 和协方差的回答。
-
即使在 C# 4 中引入它仍然是当今 stackoverflow 上关于 C# 的最常见问题之一。
-
IEnumerable 是一个非常简单的接口,你不能用它来破坏列表。无法将猫添加到该狗列表中或让那些狗说喵。所以转换是安全的,你所能做的就是从列表中获取狗并让它们看起来像一个 Animal 是可以的,因为它是 Dog 的基类。它是框架中为数不多的允许这样做的接口之一。