C # LINQ фильтр IEnumerable <IX>и выражается как IEnumerable - PullRequest
0 голосов
/ 01 февраля 2019

Очевидно, что невозможно привести 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> и устанавливает нулевой результат (несколько загадочно).

Кажется логичным, что фильтр может быть применен к IEnumerable<IX>, а результат выражен как IEnumerable<X:IX> (без фактического перечисления).

Но как это сделать?

1 Ответ

0 голосов
/ 01 февраля 2019

Это происходит потому, что filtered равен IEnumerable<IX> (хотя он содержит только элементы X2 после фильтрации) и не может быть напрямую приведен к IEnumerable<X2>.
. Вы можете сделать это и разыграть * 1006.*:

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) 
{

}
...