object [] to List <Interface>返回null

Dar*_*bio 1 c# generics interface

如果我有一个看起来像这样的物体:

class Person : IProxy
{
    // Properties
}
Run Code Online (Sandbox Code Playgroud)

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

object GetList()
{
    List<Person> people = new List<Person>();

    person.Add(new Person());
    person.Add(new Person());

    return people;
}
Run Code Online (Sandbox Code Playgroud)

为什么以下代码导致null?

var obj = GetList() as List<IProxy>;
Run Code Online (Sandbox Code Playgroud)

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

var obj = GetList() as List<Person>;
Run Code Online (Sandbox Code Playgroud)

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

object {System.Collections.Generic.List<Person>}
Run Code Online (Sandbox Code Playgroud)

par*_*mar 5

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

GetList().OfType<IProxy>()
Run Code Online (Sandbox Code Playgroud)

会做你想做的.你也可以使用

GetList().Cast<IProxy>()
Run Code Online (Sandbox Code Playgroud)

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

协方差和反差异常见问题可能会回答您的更多问题.