变体和开放式泛型IReadOnlyList

时间:2017-01-06 10:40:40

标签: c# generics

我试图理解为什么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>

我觉得必须是因为没有考虑类型约束,但我对此表示怀疑。

1 个答案:

答案 0 :(得分:13)

您只需要将class约束添加到TLine

class Matrix<TLine> where TLine : class, ILine

这将确保TLine是引用类型 - 然后允许通用方差起作用。 Variance only 适用于引用类型,因为CLR知道类型TLine的值可以用作类型ILine的值而不需要任何装箱或其他更改表示。