如何将List <t>传递给另一个T实现的类型列表</t>

时间:2011-11-03 12:00:31

标签: c# asp.net

所以我有一个继承下面接口的基本类

public interface IRefDataItem
{
    int RefID { get; set; }
string Code { get; set; }
}

public class RACodeItem : IRefDataItem
{
    public int RefID { get; set; }
    public string Code { get; set; }
}

然后我有一个方法返回一个RACodeItem列表,我试图将其分配给IRefDataItem列表,如下所示

List<IRefDataItem> codes = GetRACodes( ); //GetRACodes returns List of RACodeItem 

我在这里收到一个错误,指出不能隐式地将RACodeItem的List类型转换为IRefDataItem的List,尽管RACodeItem继承了IRefDataItem

我在这里错过了一些简单的东西吗?如何将T列表转换为T实现的接口类型的列表?

干杯

斯图尔特

2 个答案:

答案 0 :(得分:5)

我理解你为什么要这样做,但是如果你想到你会意识到这不起作用。

例如(此代码无法编译)

public interface ITest
{
}

public class Test1 : ITest
{
}

public class Test2 : ITest
{ }


static void Main(string[] args)
{
    List<ITest> list = new List<Test1>();

    list.Add(new Test1());
    list.Add(new Test2());

}

问题是您无法将Test2添加到Test1列表中。将列表声明为List<ITest> list = new List<ITest>();将编译,您可以添加Test1和Test2。

答案 1 :(得分:0)

假设您有以下层次结构。动物 - &gt;马,猫 现在你有了List。您可以将两匹马分配给它并将猫分配给它。 但我们的清单应该有相同类型的动物。

Eric Lippert有一篇关于此事的优秀博客。 http://blogs.msdn.com/b/ericlippert/archive/2007/10/16/covariance-and-contravariance-in-c-part-one.aspx