gpt4 book ai didi

c# - 与 C# 泛型的协变

转载 作者:IT王子 更新时间:2023-10-29 04:28:44 25 4
gpt4 key购买 nike

给定接口(interface) IQuestion 和该接口(interface)的实现 AMQuestion,假设以下示例:

List<AMQuestion> typed = new List<AMQuestion>();
IList<IQuestion> nonTyped = typed;

正如预期的那样,这个例子产生了一个编译错误,指出两者不是同一类型。但它指出存在显式转换。所以我将其更改为如下所示:

List<AMQuestion> typed = new List<AMQuestion>();
IList<IQuestion> nonTyped = typed as IList<IQuestion>;

然后编译,但在运行时,nonTyped 始终为 null。如果有人可以解释两件事:

  • 为什么这不起作用。
  • 我怎样才能达到预期的效果。

将不胜感激。谢谢!

最佳答案

事实AMQuestion实现 IQuestion接口(interface)不翻译成List<AMQuestion>源自 List<IQuestion> .

因为这个转换是非法的,你的 as运算符(operator)返回 null .

您必须单独转换每个项目:

IList<IQuestion> nonTyped = typed.Cast<IQuestion>().ToList();

关于您的评论,请考虑以下代码,以及常见的陈词滥调的动物示例:

//Lizard and Donkey inherit from Animal
List<Lizard> lizards = new List<Lizard> { new Lizard() };
List<Donkey> donkeys = new List<Donkey> { new Donkey() };

List<Animal> animals = lizards as List<Animal>; //let's pretend this doesn't return null
animals.Add(new Donkey()); //Reality unravels!

如果我们被允许施放List<Lizard>List<Animal> , 那么理论上我们可以添加一个新的 Donkey到那个列表,这会破坏继承。

关于c# - 与 C# 泛型的协变,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24286912/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com