Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/277.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 关于协方差与逆变换_C#_.net_.net 4.0_Covariance_Contravariance - Fatal编程技术网

C# 关于协方差与逆变换

C# 关于协方差与逆变换,c#,.net,.net-4.0,covariance,contravariance,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 I

情况是

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;
    }
 }
公共接口IRow
{
int Id{get;set;}
字符串名称{get;set;}
}
公共类ARow:IRow
{ ... }
公共类眉毛:IRow
{ ... }
公共类RowCollection:集合,其中T:IRow
{    }
公共接口ITable,其中T:IRow
{
行集合数据行{get;}
int Id{get;set;}
字符串名称{get;set;}
}
公共类ATable:ITable
{
公共行集合数据行
{
得到;
设置
}
}
公共类BTable:ITable
{
公共行集合数据行
{
得到;
设置
}
}
当我这样做的时候

        List<ITable<IRow>> lt = new List<ITable<IRow>>();
        ITable<IRow> ads = new ATable();
List lt=newlist();
ITable ads=新的ATable();
我得到了错误,我知道这与协方差和逆变有关,如果有人能帮我克服这个错误,我将不胜感激

当然,我需要了解更多关于此主题的信息,但首先希望得到有关解决此问题/场景的快速帮助

问候,,
San

ATable
是一个
ITable
;它不是一个
ITable
。如果是,您可以添加实现
IRow
的任何行类型,但它只能接受从
ARow
继承的行类型

如果
ITable
是协变的(即,如果定义为
ITable
,则可以将
ITable
视为
ITable
,但
out
关键字表示
T
仅用作属性和方法的输出。因为您有一个不协变的
RowCollection
属性(因为它继承自使用
T
作为输入的
Collection
),所以不能使
ITable
协变

即使
DataRows
属性只有一个
get
访问器,也只能使对集合的引用成为只读的。您仍然可以将
T
s添加到集合中,使其不具有协变性。您可以将声明的类型更改为
IEnumerable
,以使集合成为“只读”集合从接口的角度来看

public interface ITable<out T> where T : IRow
{
    IEnumerable<T> DataRows { get; }
    int Id { get; set; }
    string Name { get; set; }
}
公共接口ITable,其中T:IRow
{
IEnumerable数据行{get;}
int Id{get;set;}
字符串名称{get;set;}
}

同样相关:,;还有其他一些。如果您已经知道导致您出现问题的术语(协方差和逆变),然后请表现出一些努力,看看你开始写这个问题时应该向你提出的许多现有问题,并表明你的问题确实是基于你在这些问题的帮助下已经获得的知识nce和CONTRAVANCE。还提到我正在寻找快速帮助/解决方案,并将了解有关此主题的更多信息。那么请知道,这不是“修复我的代码”或“为我做我的工作”网站。当你问一个问题时,你正在投入工作。这包括实际上费心首先尝试自己解决问题。谢谢Stanley。我希望是一个只读集合(get),所以我已经相应地更改了代码。谢谢你的观点。