5

子クラスが継承する抽象親クラスがあります。List<>さまざまな子クラスの多くのタイプを含む別のクラスがあります。List<ParentType>次に、のパラメータを取り、抽象として宣言されたメソッドを呼び出すメソッドが別のクラスにあります。

List<T>.Cast<T2>子クラスのリストでの使用に問題があります。エラーが発生しました:

System.Linq.Enumerable.Cast(System.Collections.IEnumerable)'は'メソッド'であり、指定されたコンテキストでは無効です

誰かがこのエラーを修正する方法を知っていますか?または、タイプのリストを再構築して、List<ParentType>各アイテムを個別に再キャストする必要がありますか?

私がやろうとしていること:public abstract class 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) {
        //...
    }
}
4

2 に答える 2

9

コードを実際に確認して修正できるようにする代わりに、代わりにメソッドを変更してみてはどうでしょうか。

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

または、C#4と.NET 4を使用している場合は、.NET 4のIEnumerable<T>共変であるように、これで問題ありませんT

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

あなたは本当に受け入れるための方法が必要List<ParentType>ですか?結局のところ、あなたが電話するつもりなら:

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

それをメソッドに渡すと、とにかくその時点で2つの完全に別個のリストが得られます。

ちなみに、の共変量のもう1つの効果は、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

コードを追加したので、2つの潜在的な問題があります。

  1. Castたとえばを呼び出すときに括弧を追加する必要があります

    listA.Cast<P>()

    Cast特別な演算子ではなく、他のどのような拡張メソッドでもあります。

  2. これらの呼び出しは、helper実際にはクラスレベルで行われており、別のメソッド内では行われていませんか?それも問題になります。

于 2012-05-31T19:57:24.053 に答える