如果我有一个看起来像的对象:
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>}
答案 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();