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 ,看起来像这样:

...
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

您不能直接从通用类强制转换实现接口的类。一种解决方案是强制转换对象或在 .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 开发人员那里获得有关此决定的一些解释,可以在此处找到:C# 中的泛型 - 无法将 'classname' 转换为 'TGenericClass'

希望这可以帮助。

于 2012-07-23T05:26:52.320 回答