情景是
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();
我得到错误,我知道它与协方差和逆变有关,如果有人可以帮助我克服这个错误将非常感激。
我确实需要了解有关此主题的更多信息,但希望能够快速帮助解决此问题/方案。
此致 圣
答案 0 :(得分:0)
ITable<IRow>
是IRow
;它不是ARow
。如果它 ,您可以添加实现ITable
的任何行类型,但它只能从ITable<out T>
继承行类型。
如果ITable<ARow>
协变(即如果它被定义为ITable<IRow>
,那么可以将out
视为{ {1}},但T
关键字表示RowCollection<T>
仅用作属性和方法的输出。因为您的Collection<T>
属性不是covariant(因为它继承自使用T
作为输入的ITable
),你不能使DataRows
协变。
即使get
属性只有T
访问者,也只能将引用设置为只读。您仍然可以将IEnumerable<T>
添加到集合中,因此它不是协变的。您可以将声明的类型更改为public interface ITable<out T> where T : IRow
{
IEnumerable<T> DataRows { get; }
int Id { get; set; }
string Name { get; set; }
}
,以便从界面的角度将集合设置为“只读”。
var a = "1eabcde";
var b = "12abcde12fg";
for (var i = 0; i <= a.length - 5; i++) {
if (b.indexOf(a.substring(i, i + 5)) >= 0) {
alert("ya");
}
}