强类型集合隐式和显式强制转换
本文关键字:转换 集合 强类型 | 更新日期: 2023-09-27 18:16:38
public void Foo (IEnumerable<object> objects)
{
}
var strings = new List<string>{"first", "second", "third"};
Foo(strings); // Compilation Error.
Foo(strings.Cast<object>()); // O.k.
- 为什么第一次调用Foo不编译?从object派生的字符串
- 如果我可以将列表强制转换为对象,它被编译,为什么编译器不自己做?
第一个调用在。net 4.0中编译。
在以前的版本中,泛型类型必须完全匹配。
我建议阅读Eric Lippert关于方差(协方差和逆变方差)的博客文章。
不要去查协方差和反方差
这是。net 4.0的新特性
- 泛型是严格的,因为您不能将派生类型的集合赋值给超类型的集合。您必须提供用于实例化集合的确切类型。
-
因为它不知道你想做什么。与下面这行不能编译的原因相同:
string s = new object();
强制用户进行"不安全"类型强制转换会给编译器太多的自由。