【问题标题】:List.Cast<> error "is a method which is not valid in the given context"List.Cast<> 错误“是在给定上下文中无效的方法”
【发布时间】:2012-06-06 02:23:48
【问题描述】:

我有一个抽象父类,子类从它继承。我有另一个类,其中包含许多不同子类的 List&lt;&gt; 类型。然后,我在另一个类中有一个方法,它采用List&lt;ParentType&gt; 的参数,并且只调用声明为抽象的方法。

我在子类列表中使用 List&lt;T&gt;.Cast&lt;T2&gt; 时遇到问题。我收到了错误:

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

有人知道如何解决这个错误吗?还是我必须重构List&lt;ParentType&gt; 类型的列表并单独重铸每个项目?

我正在尝试做的事情: 公共抽象类 P { 公共整数; 公共抽象双 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) {
        //...
    }
}

【问题讨论】:

  • 你应该发布给你这个错误的代码。
  • @Paul - 确实如此。没有上下文,我们无法为您提供太多帮助。

标签: c# linq casting


【解决方案1】:

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

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

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

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

你真的需要接受List&lt;ParentType&gt;的方法吗?毕竟,如果你要打电话:

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

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

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

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

编辑:既然您已经发布了您的代码,只需不调用Cast 方法作为一个方法:

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

// should be this:
helper(listB.Cast<P>().ToList())

【讨论】:

  • 不幸的是,我在这个项目上坚持使用 .NET 3.5。您的第一个示例有效,非常感谢!我不知道你可以在 C# 中做这样的语法
【解决方案2】:

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

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

    listA.Cast&lt;P&gt;()

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

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

【讨论】:

  • 感谢您指出这一点,是的,助手处于同一班级。我也会更改 .Cast() 调用。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-07-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多