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),所以我已经相应地更改了代码。谢谢你的观点。