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>}
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();