作者:大佬銘銘銘銘銘 | 来源:互联网 | 2022-11-19 11:59
显然,这是不可能投WhereEnumerableIterator
给IEnumerable
public interface IX
public class X1 : IX
public class X2 : IX
public void Method1(IEnumerable arg)
{
var filtered = arg.Where(e => e.GetType() == typeof(X2));
// filtered will be of type WhereEnumerableIterator
Method2(filtered as IEnumerable);
}
public void Method2(IEnumerable arg)
{
// at runtime arg will be null
}
显然,CLR无法投WhereEnumerableIterator
给IEnumerable
和集导致空(有点神秘).
似乎合乎逻辑的是,可以应用过滤器IEnumerable
并将结果表示为IEnumerable
(实际上没有枚举).
但是怎么做呢?
1> Yeldar Kurma..:
它发生了,因为filtered
是IEnumerable
(即使它只包含X2
过滤后的项目)并且无法直接转换为IEnumerable
.
你可以这样做并投下你的IEnumerable
:
var filtered = arg.Where(e => e.GetType() == typeof(X2)).Cast();
// filtered will be of type WhereEnumerableIterator now
Method2(filtered);
但您可以根据其元素的类型Enumerable.OfType
过滤IEnumerable
:
public void Method1(IEnumerable arg)
{
var filtered = arg.OfType();
Method2(filtered);
}
public void Method2(IEnumerable arg)
{
}