首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >论协方差与逆方差

论协方差与逆方差
EN

Stack Overflow用户
提问于 2016-03-30 02:30:51
回答 1查看 59关注 0票数 0

场景是

代码语言:javascript
复制
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;
    }
 }

当我这样做的时候

代码语言:javascript
复制
        List<ITable<IRow>> lt = new List<ITable<IRow>>();
        ITable<IRow> ads = new ATable();

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

当然,我需要了解更多关于这个主题的知识,但我希望首先得到解决这个问题/场景的快速帮助。

致以敬意,San

EN

回答 1

Stack Overflow用户

发布于 2016-03-30 02:37:06

ATableITable<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>,以从接口的角度将集合设置为“只读”。

代码语言:javascript
复制
public interface ITable<out T> where T : IRow
{
    IEnumerable<T> DataRows { get; }
    int Id { get; set; }
    string Name { get; set; }
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36292328

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档