从C#中的List中选择指定的子类型

src*_*091 1 c# types type-inference type-conversion

我有一个函数,当给定a时List<T>,从中选择一个List<V>这样的函数V : T:

目前的实施是:

public List<V> Subset<T, V>(IEnumerable<T> exo)
    where V : class
    where V : T
{
    return exo.Where(elem => elem is V).Select(elem => elem as V).ToList();
}
Run Code Online (Sandbox Code Playgroud)

虽然我觉得更简洁应该有用,因为它被声明V是以下的子类T:

// Does not comile: can not implicitly convert List<T> to List<V>
public List<V> Subset<T, V>(IEnumerable<T> exo) where V : T
{
    return exo.Where(elem => elem is V).ToList();
}
Run Code Online (Sandbox Code Playgroud)

你能否解释为什么它无法推断出正确的类型,也许我的当前实施是否是最好的?

Ser*_*kiy 9

您可以使用Enumerable.OfType根据参数类型过滤序列:

return exo.OfType<V>().ToList();
Run Code Online (Sandbox Code Playgroud)

为什么你的第二个代码不起作用 - 它从序列中选择V项,但结果类型仍然是列表T.序列只是被一些谓词过滤(你在那里检查的无关紧要 - 是V类型的项目,或者可能是项目不为null,或者是其他条件).您知道自己检查了什么,但编译器仍然将结果视为一系列已过滤的基类对象.

并且您不能从方法返回基类对象的列表,该方法应该返回派生对象的列表.如果可能,那么您可以返回未过滤的基类列表.