2009-09-27 21 views
1

問題出在這裏。我想創建一個包含配置數據的類。該數據由鍵/值對組成。一些例子:「主機名」 =「本地主機」,「超時」 = 1000等。我最初的想法是存儲所有這些在通用字典:幫助在C#4.0中使用差異

private Dictionary<string, ConfigurationItem<object>> Configuration = 
    new Dictionary<string, ConfigurationItem<object>>(); 

而且形態項目類爲:

public class ConfigurationItem<T> 
{ 
    public string Name { get; set; } 
    public T Value { get; set; } 
} 

我的希望是,我可以查詢和設置的配置如下:

int i = Configuration.Get<int>("Timeout"); 
Configuration.Set("Timeout", 1000); 

不幸的是,使用下面的代碼我不能插入在配置字典項:

public void SetValue<T>(string key, ConfigurationItem<T> value) 
{ 
     if (Configuration.ContainsKey(key.ToUpper())) 
      Configuration[key.ToUpper()] = **value**; 
     else 
      Configuration.Add(key.ToUpper(), **value**); 
} 

大膽的部分顯示錯誤:

不能鍵入形態項目< T>轉換爲形態項目<對象>

我使用C#4.0,因爲我用希望來修復這個問題新的差異功能,但目前還沒有運氣。如果需要更多信息,只需將其命名!謝謝你的幫助!

回答

0

您可以將您的字典定義爲私有字典< string,object>,然後在從Get方法返回對象之前進行對象轉換。

+0

謝謝蘭斯,那就是我要做的事情,儘管我正在尋找一個不需要任何明確投射的解決方案。 – Dominiek

2

C#4.0中的協變和逆變僅適用於接口和委託。

根據接口成員定義中類型參數的用法位置,必須在類型參數前加上inout

例如:

public interface IConfigurationItem<out T> 
{ 
    public string Name { get; set; } 
    public T Value { get; set; } 
} 

因爲IDictionary<TKey,TValue>用來輸入和輸出,字典其兩個類型參數不是協變或逆變。

+0

謝謝埃裏克。你是對的。 –

1

從C#4.0草案規範方差侷限性

23.3侷限性 CO-和逆變類型參數只能在接口和委託類型中聲明。只有在類型參數之間存在引用(或標識)轉換時才適用共同和反轉。例如,IEnumerable<int>不是IEnumerable<object>,因爲從int到object的轉換是裝箱轉換,而不是參考轉換。