强类型集合隐式和显式强制转换

本文关键字:转换 集合 强类型 | 更新日期: 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.
  1. 为什么第一次调用Foo不编译?从object派生的字符串
  2. 如果我可以将列表强制转换为对象,它被编译,为什么编译器不自己做?

强类型集合隐式和显式强制转换

第一个调用在。net 4.0中编译。

在以前的版本中,泛型类型必须完全匹配

我建议阅读Eric Lippert关于方差(协方差和逆变方差)的博客文章。

不要去查协方差和反方差

这是。net 4.0的新特性

  1. 泛型是严格的,因为您不能将派生类型的集合赋值给超类型的集合。您必须提供用于实例化集合的确切类型。
  2. 因为它不知道你想做什么。与下面这行不能编译的原因相同:

    string s = new object();
    

强制用户进行"不安全"类型强制转换会给编译器太多的自由。