object[] to List<Interface> returns null

本文关键字:Interface gt returns null lt to List object | 更新日期: 2023-09-27 18:13:59

如果我有一个对象看起来像:

class Person : IProxy
{
    // Properties
}

我有一个返回object的方法它实际上是List<Person>

object GetList()
{
    List<Person> people = new List<Person>();
    person.Add(new Person());
    person.Add(new Person());
    return people;
}

为什么下面的代码结果为null?

var obj = GetList() as List<IProxy>;

但是下面的代码返回一个List:

var obj = GetList() as List<Person>;

在Visual Studio的Watch面板中,我的类型报告为:

object {System.Collections.Generic.List<Person>}

object[] to List<Interface> returns null

A List<Person>List<IProxy>是两种不同的类型,因此将它们转换为另一种可能产生null。

GetList().OfType<IProxy>()

将做你想做的。也可以使用

GetList().Cast<IProxy>()

我个人更喜欢OfType,因为当集合包含异构类型时它不会抛出异常

协方差和逆变常见问题解答

因为List<People>List<IProxy>是不同的类型。假设你有class Cat : IProxy。如果您可以将List<People>转换为List<IProxy>,那么您可以添加Cat,我认为您不会想要这样做。这里缺少的是泛型逆变,例如,在java中,您可以合法地将列表强制转换为List<? extends IProxy>,这将允许您从列表中读取IProxy对象,但不向其写入任何内容。

为什么GetList()的返回类型是object ?指定List<Person>IList<Person>会更有意义。这样,就不必在调用方法后进行强制类型转换。

如果你想从你的方法中得到一个List<IProxy>,你可以这样做:

List<IProxy> GetList() 
{ 
    List<IProxy> people = new List<IProxy>(); 
    people.Add(new Person()); 
    people.Add(new Person()); 
    return people; 
} 
然后

var obj = GetList();