所以我有一个继承下面接口的基本类
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实现的接口类型的列表?
干杯
斯图尔特
答案 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