List.Cast <> error"是在给定上下文中无效的方法"

Dav*_*vid 4 c# linq casting

我有一个抽象的父类,它继承了它的子类.我有另一个类,包含许多List<>类型的不同子类.然后我在另一个类中有一个方法,它接受一个参数,List<ParentType>并且只调用声明为abstract的方法.

我在使用List<T>.Cast<T2>子类列表时遇到问题.我收到错误:

System.Linq.Enumerable.Cast(System.Collections.IEnumerable)'是'方法',在给定的上下文中无效

有谁知道如何解决这个错误?或者我是否必须重建类型列表List<ParentType>并单独重铸每个项目?

我正在尝试做什么:公共抽象类P {public int num; public abstract double addSections(); }

public class A : P {
    public int num2;
    public A(int r, int n) {
        num = r;
        num2 = n;
    }
    public double addSections() { return (double)num + (double)num2; }
}

public class B : P {
    public double g;
    public B(int r, double k) {
        num = r;
        g = k;
    }
    public double addSections() { return (double)num + g; }
}

public class MyClass {
    public MyClass() {
        List<A> listA;
        List<B> listB;
        //...
        helper(listA.Cast<P>()); //doesn't work
        helper(listB.Cast<P>().ToList()); //doesn't work either
    }

    public void helper(List<P> list) {
        //...
    }
}
Run Code Online (Sandbox Code Playgroud)

Jon*_*eet 8

代替实际看到您的代码以便我们可以修复它,如何更改方法:

public void DoSomething<T>(IEnumerable<T> items) where T : ParentType
{
    ... 
}
Run Code Online (Sandbox Code Playgroud)

或者如果您使用的是C#4和.NET 4,这应该没问题,因为在.NET 4中IEnumerable<T>是协变的T.

public void DoSomething(IEnumerable<ParentType> items)
{
    ... 
}
Run Code Online (Sandbox Code Playgroud)

你真的需要这种方法来接受List<ParentType>吗?毕竟,如果你打算打电话:

var parentList = childList.Cast<ParentType>().ToList();
Run Code Online (Sandbox Code Playgroud)

并将其传递给方法,然后无论如何你都有两个完全独立的列表.

顺便说一句,协变的另一个影响IEnumerable<T>是在.NET 4中你可以避免Cast调用并只调用:

var parentList = childList.ToList<ParentType>();
Run Code Online (Sandbox Code Playgroud)

编辑:现在您已经发布了代码,这只是不将Cast方法作为方法调用的问题:

// This...
helper(listB.Cast<P>.ToList())

// should be this:
helper(listB.Cast<P>().ToList())
Run Code Online (Sandbox Code Playgroud)