2016-03-29 79 views
0

的情況是協方差和逆變

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

當我做這樣的事情

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

我得到的錯誤,我知道它是與協方差和逆變,如果有人能幫助我克服這個錯誤將不勝感激。

當然,我需要了解有關此主題的更多信息,但希望能夠首先快速解決此問題。

問候, 聖

+0

另外相關:(http://stackoverflow.com/questions/1724919/understanding-covariance-and-contravariance-in-c-sharp-4-0)[以C#4.0瞭解協變和逆變] [瞭解C#中的協變和逆變接口](http://stackoverflow.com/questions/2719954/understanding-covariant-and-contravariant-interfaces-in-c-sharp),[爲什麼我不能指定一個列表一個列表?](http://stackoverflow.com/questions/4652858/why-cant-i-assign-a-listderived-to-a-listbase);還有其他一些。 – poke

+0

如果你已經知道什麼是造成你的問題(協方差和逆變)的術語,那麼請展示一些努力,並且看看你開始寫這個問題時應該向你提出的許多*現有問題,以及表明你的問題確實是基於你在這些問題的幫助下已經獲得的知識。 – poke

+0

完全讀出我的問題......我已經承認它的協變和逆變。還提到我正在尋找一個快速幫助/解決方案,並會在這個主題上了解更多。 – sanoj

回答

0

ATableITable<ARow>;它不是ITable<IRow>。如果它,則可以添加實現IRow的任何行類型,但只能從ARow繼承行類型。

如果ITable協變(即,如果它被定義爲ITable<out T>可以治療的ITable<ARow>作爲ITable<IRow>,但out關鍵字指示T僅用作輸出從屬性和方法。由於你有沒有協變一RowCollection<T>性質(因爲它是從Collection<T>它採用T作爲輸入繼承),你不能讓ITable協變的。

儘管DataRows屬性僅具有get訪問器,但它只將引用設置爲只讀集合。您仍然可以將T添加到集合中,因此它不是協變的。您可以將聲明的類型更改爲IEnumerable<T>,以使集合從接口的角度爲「只讀」。

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

謝謝史丹利。我的期望是隻讀集合(獲得),所以我已經相應地更改了代碼。謝謝你的觀點。 – sanoj