作者热门文章
- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
是否可以转换 List<Subclass>
至 List<Superclass>
在 C# 4.0 中?
大致是这样的:
class joe : human {}
List<joe> joes = GetJoes();
List<human> humanJoes = joes;
这不就是协方差的作用吗?
如果你能做到:
human h = joe1 as human;
为什么你不能做
List<human> humans = joes as List<human>;
做 (joe)humans[0] 是不合法的,因为那个项目已经被贬低了..每个人都会很高兴。现在唯一的选择是创建一个新的列表
最佳答案
你不能这样做,因为它不安全。考虑:
List<Joe> joes = GetJoes();
List<Human> humanJoes = joes;
humanJoes.Clear();
humanJoes.Add(new Fred());
Joe joe = joes[0];
显然最后一行(如果不是更早的话)必须失败 - 作为 Fred
不是 Joe
. List<T>
的不变性在编译而不是执行时防止这个错误。
关于c# - c#中的协方差,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4038125/
在我的设置中,我试图有一个界面 Table继承自 Map (因为它主要用作 map 的包装器)。两个类继承自 Table - 本地和全局。全局的将有一个可变的映射,而本地的将有一个只有本地条目的映射。
Rust Nomicon 有 an entire section on variance除了关于 Box 的这一小节,我或多或少地理解了这一点和 Vec在 T 上(共同)变体. Box and Vec
我是一名优秀的程序员,十分优秀!