作者热门文章
- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
给定接口(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/
在我的设置中,我试图有一个界面 Table继承自 Map (因为它主要用作 map 的包装器)。两个类继承自 Table - 本地和全局。全局的将有一个可变的映射,而本地的将有一个只有本地条目的映射。
Rust Nomicon 有 an entire section on variance除了关于 Box 的这一小节,我或多或少地理解了这一点和 Vec在 T 上(共同)变体. Box and Vec
我是一名优秀的程序员,十分优秀!