1

我有一个函数,当给定 a 时,List<T>会从中选择 a 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();
}

虽然我觉得更简洁的东西应该起作用,因为它被声明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();
}

您能否解释一下为什么它无法推断出正确的类型,也许我目前的实现是最好的?

4

1 回答 1

10

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

return exo.OfType<V>().ToList();

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

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

于 2013-01-03T10:40:30.523 回答