2016-03-29 9 views
0

Szenario istAuf Kovarianz und Kontra

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; 
    } 
} 

Wenn ich etwas tun, wie dies

 List<ITable<IRow>> lt = new List<ITable<IRow>>(); 
     ITable<IRow> ads = new ATable(); 

ich Fehler, ich seine etwas wissen mit Kovarianz und Kontra zu tun, wenn jemand mir dies überwinden helfen kann Fehler wird sehr geschätzt.

Sicherlich muss ich mehr zu diesem Thema erfahren, erwarte aber eine schnelle Hilfe zur Behebung dieses Problems/Szenarios.

Grüße, San

+0

Auch bezogen werden: (http://stackoverflow.com/questions/1724919/understanding-covariance-and-contravariance-in-c-sharp-4-0) [Kovarianz und Kontra in C# 4.0 zu verstehen], [Verständnis von kovarianten und kontravarianten Schnittstellen in C#] (http://stackoverflow.com/questions/2719954/understanding-covariant-and-contravariant-interfaces-in-c-sharp), [Warum kann ich keine Liste zuweisen? eine Liste ?] (http://stackoverflow.com/questions/4652858/why-cant-i-assign-a-listderived-to-a-listbase); und da sind noch ein paar andere. – poke

+0

Wenn Sie bereits wissen, was Ihnen Probleme bereitet (Kovarianz und Kontravarianz), dann zeigen Sie bitte etwas Mühe und schauen Sie sich tatsächlich die vielen * existierenden * Fragen an, die Ihnen vorgeschlagen werden sollten, als Sie mit dem Schreiben dieser Frage begannen zeigen Sie, dass Ihr Problem tatsächlich auf dem Wissen basiert, das Sie bereits mit Hilfe dieser Fragen erworben haben. – poke

+0

lesen Sie meine Frage vollständig aus ... ich habe bestätigt, dass es auf Co-Varianz und Kontravarianz. Auch erwähnt, dass ich nach einer schnellen Hilfe/Lösung suche und mehr über dieses Thema erfahren werde. – sanoj

Antwort

0

ATable ist ein ITable<ARow>; Es ist kein ITable<IRow>. Wenn es wäre, könnten Sie einen beliebigen Zeilentyp hinzufügen, der IRow implementiert, aber es kann nur Zelltypen annehmen, die von ARow erben.

Wenn ITable waren covariant (dh, wenn es als ITable<out T> definiert wurden Sie dann konnte eine ITable<ARow> behandeln als ITable<IRow>, aber das out Schlüsselwort gibt an, dass T nur als Ausgänge verwendet wird von Eigenschaften und Methoden. Da Sie haben eine RowCollection<T> Eigenschaft, die nicht kovariant ist (weil es von Collection<T> erbt die T als Eingänge verwendet), können Sie nicht ITable covariant machen.

Auch wenn die DataRows Eigenschaft nur einen get Accessor hat, macht das nur die Referenz auf die Sammlung schreibgeschützt. Sie können der Sammlung weiterhin T s hinzufügen, damit sie nicht kovariant ist. Sie könnten den deklarierten Typ in IEnumerable<T> ändern, um die Sammlung vom Standpunkt der Schnittstelle aus "schreibgeschützt" zu machen.

public interface ITable<out T> where T : IRow 
{ 
    IEnumerable<T> DataRows { get; } 
    int Id { get; set; } 
    string Name { get; set; } 
} 
+0

Danke Stanley. Ich erwarte eine readonly Sammlung (get), also habe ich den Code entsprechend geändert. Danke für deine Punkte. – sanoj