场景是
public interface IRow
{
int Id { get; set; }
string Name { get; set; }
}
public class ARow : IRow
{ ... }
public class BRow : IRow
{ ... }
public class RowCollection<T> : Collection<T> where T : IRow
{ }
public interface ITable<T> where T : IRow
{
RowCollection<T> DataRows { get; }
int Id { get; set; }
string Name { get; set; }
}
public class ATable : ITable<ARow>
{
public RowCollection<ARow> DataRows
{
get;
set;
}
}
public class BTable : ITable<BRow>
{
public RowCollection<BRow> DataRows
{
get;
set;
}
}当我这样做的时候
List<ITable<IRow>> lt = new List<ITable<IRow>>();
ITable<IRow> ads = new ATable();我得到了错误,我知道这与协方差和逆方差有关,如果有人能帮助我克服这个错误,我将非常感激。
当然,我需要了解更多关于这个主题的知识,但我希望首先得到解决这个问题/场景的快速帮助。
致以敬意,San
发布于 2016-03-30 02:37:06
ATable是ITable<ARow>;它不是ITable<IRow>。如果是,您可以添加任何实现IRow的行类型,但它只能接受从ARow继承的行类型。
如果ITable是协变的(即,如果它被定义为ITable<out T>,那么您可以将ITable<ARow>视为ITable<IRow>,但out关键字指示T仅用作属性和方法的输出。因为您有一个不是协变的RowCollection<T>属性(因为它继承自使用T作为输入的Collection<T> ),所以您不能使ITable协变。
即使DataRows属性只有一个get访问器,这也只是使对集合的引用成为只读的。您仍然可以将T%s添加到集合中,这样它就不是协变的。您可以将声明的类型更改为IEnumerable<T>,以从接口的角度将集合设置为“只读”。
public interface ITable<out T> where T : IRow
{
IEnumerable<T> DataRows { get; }
int Id { get; set; }
string Name { get; set; }
}https://stackoverflow.com/questions/36292328
复制相似问题