2011-02-24 25 views
3

這是我第一次在這裏發表問題,所以先感謝任何人都會幫助我(也許還有其他人)。有合法施法的機會嗎?

今天我一直不解帶協方差和逆變在C#4,但我實在看不出任何可能性做什麼,我會的。 注:所有這些都是來解決特定的問題,但我想知道是否有任何合法的方式(全新CO /禁忌方差在C#4),以解決這個問題。 所以,不要弄瘋了...

下面的代碼示例:

public interface IBase<in T> 
{ 
    T GetValue(); 
    ... 
} 


public class Readable<T> : IBase<T> 
{ 
    public T GetValue() {/* */} 
    ... 
} 


public class Writeable<T> : IBase<T> 
{ 
    public T GetValue() {/* */} 
    public void SetValue(T value) {/* */} 
    ... 
} 


public class Program 
{ 
    private List<IBase<object>> _collection = new List<IBase<object>>(); 


    public static void Main() 
    { 
     var p = new Program(); 

     p._collection.Add(new Readable<bool>()); //not allowed 
    } 
} 

收集應該能夠舉辦任何IBASE的衍生物,是任何T. 當然,我的這些可能會使用非通用集合或列表,遊戲結束。 另一個想法是有一個更常見的接口IBaseCore,然後IBase繼承。 我的問題是:如果沒有這些技巧,我是否可以獲得IBase的集合並添加任何IBase的項目?

感謝大家。

回答

3

編輯:首先第一件事情,你的變化是錯誤的IBase<T>。它應該是out T(協變)而不是in T(逆變)。

這裏的問題很簡單,通用的協方差和逆變並不值類型爲類型參數工作。所以你可以添加一個Readable<string>,但不是Readable<bool>

一種選擇是有一個非泛型基本接口:

public interface IBase 
{ 
    object GetValueAsObject(); 
} 

public interface IBase<out T> : IBase 
{ 
    T GetValue(); 
    ... 
} 

然後你可以有一個List<IBase>

+0

驚人的喬恩...哇!我會睡不着今晚! – 2011-02-24 14:32:33

+0

是的,IBase非泛型是一個想法。我不知道嵌套的類型......無論如何非常感謝! – 2011-02-24 14:34:39