【发布时间】:2019-02-01 00:29:58
【问题描述】:
显然不可能将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>(没有实际枚举)似乎是合乎逻辑的。
但是怎么做呢?
【问题讨论】:
-
我认为您可以使用
art.OfType<X2>()根据其类型过滤IEnumerable -
扩展 Yeldar 的评论
.OfType<X2>()将返回一个IEnumerable<X2>,因此之后无需再进行任何转换。
标签: c# linq interface casting ienumerable