我试图理解为什么c#中有关变体和泛型的特定行为无法编译。
class Matrix<TLine> where TLine : ILine
{
TLine[] _lines;
IReadOnlyList<ILine> Lines { get { return _lines; } } //does not compile
IReadOnlyList<TLine> Lines { get { return _lines; } } //compile
}
我无法理解为什么这不起作用:
_lines
,属于TLine[]
类型,实现IReadOnlyList<TLine>
IReadOnlyList<out T>
是一个变体通用界面,根据我的理解,这意味着任何实施IReadOnlyList<TLine>
的内容都可以用作IReadOnlyList<ILine>
我觉得必须是因为没有考虑类型约束,但我对此表示怀疑。
答案 0 :(得分:13)
您只需要将class
约束添加到TLine
:
class Matrix<TLine> where TLine : class, ILine
这将确保TLine
是引用类型 - 然后允许通用方差起作用。 Variance only 适用于引用类型,因为CLR知道类型TLine
的值可以用作类型ILine
的值而不需要任何装箱或其他更改表示。