显然不可能转换 WhereEnumerableIterator<IX>
至 IEnumerable<X:IX>
public interface IX
public class X1 : IX
public class X2 : IX
public void Method1(IEnumerable<IX> arg)
{
var filtered = arg.Where(e => e.GetType() == typeof(X2));
// filtered will be of type WhereEnumerableIterator<IX>
Method2(filtered as IEnumerable<X2>);
}
public void Method2(IEnumerable<X2> arg)
{
// at runtime arg will be null
}
显然 CLR 无法转换 WhereEnumerableIterator<IX>
至 IEnumerable<X2>
并将结果设置为 null(有点神秘)。
过滤器可以应用于 IEnumerable<IX>
似乎合乎逻辑。结果表示为IEnumerable<X:IX>
(实际上没有列举)。
但是如何做到这一点?
最佳答案
它发生了,因为 filtered
是IEnumerable<IX>
(即使过滤后它只包含 X2
的项目)并且不能直接转换为 IEnumerable<X2>
.
你可以这样做并转换你的 IEnumerable
:
var filtered = arg.Where(e => e.GetType() == typeof(X2)).Cast<X2>();
// filtered will be of type WhereEnumerableIterator<X2> now
Method2(filtered);
但是你可以只使用 Enumerable.OfType
过滤 IEnumerable
基于其元素的类型:
public void Method1(IEnumerable<IX> arg)
{
var filtered = arg.OfType<X2>();
Method2(filtered);
}
public void Method2(IEnumerable<X2> arg)
{
}
关于C# LINQ 筛选 IEnumerable<IX> 并表示为 IEnumerable<X :IX>,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54471250/