5

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

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

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

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

我正在尝试做的事情: public abstract class P { public int num; 公共抽象双 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) {
        //...
    }
}
4

2 回答 2

9

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

public void DoSomething<T>(IEnumerable<T> items) where T : ParentType
{
    ... 
}

或者,如果您使用 C# 4 和 .NET 4,这应该没问题,就像.NET 4IEnumerable<T>中的协变一样T

public void DoSomething(IEnumerable<ParentType> items)
{
    ... 
}

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

var parentList = childList.Cast<ParentType>().ToList();

并将其传递给方法,那么无论如何你已经得到了两个完全独立的列表。

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

var parentList = childList.ToList<ParentType>();

编辑:现在您已经发布了代码,只需不将该Cast方法作为方法调用即可:

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

// should be this:
helper(listB.Cast<P>().ToList())
于 2012-05-31T19:47:29.520 回答
2

现在您已经添加了代码,我看到了两个潜在的问题:

  1. 调用时需要加括号,Cast例如

    listA.Cast<P>()

    Cast不是一些特殊的运算符,它是一种扩展方法,就像其他任何东西一样。

  2. 这些调用helper实际上是在类级别,而不是在另一个方法中吗?那也会是个问题。

于 2012-05-31T19:57:24.053 回答