关于协方差和逆变

时间:2016-03-29 18:30:51

标签: c# .net .net-4.0 covariance contravariance

情景是

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();

我得到错误,我知道它与协方差和逆变有关,如果有人可以帮助我克服这个错误将非常感激。

我确实需要了解有关此主题的更多信息,但希望能够快速帮助解决此问题/方案。

此致 圣

1 个答案:

答案 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");
    }
}
相关问题