object [] to List <interface>返回null </interface>

时间:2011-11-09 06:33:05

标签: c# generics interface

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

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的“监视”面板中,我的类型报告为:

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

3 个答案:

答案 0 :(得分:5)

List<Person>List<IProxy>是两种不同的类型,因此将一个转换为另一个可能会产生空值。

GetList().OfType<IProxy>()

会做你想要的。您也可以使用

GetList().Cast<IProxy>()

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

Covariance and Contravariance FAQ可能会回答您的更多问题。

答案 1 :(得分:1)

因为List<People>List<IProxy>的类型不同。想象一下,你有class Cat : IProxy。如果您可以将List<People>投射到List<IProxy>,则可以向其添加Cat,我认为您不会想要它。缺少的是这里的通用逆转,例如,在java中你可以合法地将你的列表转换为List<? extends IProxy>,这样你就可以从列表中读取IProxy个对象,但不能写任何东西。

答案 2 :(得分:-2)

为什么返回类型为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();