0

私は次のpublic interface IofMine{}ようなインターフェースとコードを持っています:

interface IItems
{
    List<IofMine> MyList;
}

public class Items: IItems{
    private List<IofMine> _myList;
    public List<IofMine> MyList
        {
            get{return _myList;}
            set{_myList = value;}
        }
}

public class ofMine : IofMine
{}

...

main のどこかで、この関数を add1 および add2 tat と呼びますが、次のようになります。

...
public static void add1<T>(Items items) where T : IofMine, new()
{
    var temp = items.MyList;
    var toAdd = new List<T>();
    temp.AddRange(toAdd); // here it talls me :  Error Argument 1: cannot convert from 'System.Collections.Generic.List<T>' to 'System.Collections.Generic.IEnumerable<IofMine>'
}

public static void add2<T>(Items items) where T : IofMine, new()
{
    var toAdd = new List<T>();
    toAdd.AddRange(items.MyList); // here it talls me :  Error Argument 1: cannot convert from 'System.Collections.Generic.List<IofMine>' to 'System.Collections.Generic.IEnumerable<T>'
}

それで、インターフェイスからのリストを、関数が受け取った汎用テンプレートからのリストで展開可能にする方法と、その逆の方法を知りたいですか?

4

2 に答える 2

0

リストではなく、リストとして toAdd 変数をインスタンス化します。したがって、次の行があります。

var toAdd = new List<T>();

メソッドで、次のように変更します。

var toAdd = new List<IofMine>();
于 2012-07-23T05:04:37.890 に答える
0

ジェネリック クラスからインターフェイスを実装するクラスを直接キャストすることはできません。1 つの解決策は、オブジェクトにキャストするか、.NET 4.0 で動的に使用することです。

public static void add1<T>(Items items) where T : IofMine
{
        List<T> temp = (List<T>)(object)items.MyList;
        var toAdd = new List<T>();
        ofMine of = new ofMine() { i = 0 };
        toAdd.Add((T)(IofMine)of);
        temp.AddRange(toAdd);
}

Microsoft 開発者からのこの決定についての説明が必要な場合は、ここで見つけることができます: Generics in C# - Cannot convert 'classname' to 'TGenericClass'

お役に立てれば。

于 2012-07-23T05:26:52.320 に答える