Ich versuche zu verstehen, warum ein bestimmtes Verhalten in Bezug auf Variante und Generics in C# nicht kompiliert.Variant und Open Generics IReadOnlyList
class Matrix<TLine> where TLine : ILine
{
TLine[] _lines;
IReadOnlyList<ILine> Lines { get { return _lines; } } //does not compile
IReadOnlyList<TLine> Lines { get { return _lines; } } //compile
}
Ich kann nicht verstehen, warum dies nicht so funktioniert:
_lines
, vonTLine[]
Typ ist, implementiertIReadOnlyList<TLine>
IReadOnlyList<out T>
ist eine Variante generische Schnittstelle, was bedeutet, soweit Ich verstehe, dass alles, wasIReadOnlyList<TLine>
implementiert, alsIReadOnlyList<ILine>
Ich denke, dass es sein muss, weil die Typ-Einschränkung nicht berücksichtigt wird, aber ich bezweifle es.
Ich denke, Sie müssen hinzufügen, eine 'Klasse' Einschränkung zu' TLine' - 'Klasse Matrix wo TLine: ILine, Klasse'. Die Kovarianz von 'IReadOnlyList ' gilt nicht, wenn 'T' ein Werttyp ist. Daher müssen Sie' TLine' als Referenztyp definieren. –
Lee
@Lee Ich wusste das auch nicht, du solltest dies als Antwort posten, da es das OP-Problem löst;) – nozzleman