显然,无法转换WhereEnumerableIterator IX到IEnumerable X:IX public interface IX public class X1 : IX public class X2 : IXpublic void Method1(IEnumerableIX arg){ var filtered = arg.Where(e = e.GetType() == typeof(X2)); // filtered wil
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> (实际上没有枚举).
但是怎么做呢?
它发生了,因为过滤的是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)
{
}
