簡體   English   中英

幫助在C#4.0中使用差異

[英]Help using variance in C# 4.0

這是問題所在。 我想創建一個包含配置數據的類。 此數據由鍵/值對組成。 一些示例:“ hostName” =“ localhost”,“ timeout” = 1000,等等。我最初的想法是將所有這些存儲在通用字典中:

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

並且ConfigurationItem類為:

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

粗體部分顯示錯誤:

無法將類型ConfigurationItem <T>轉換為ConfigurationItem <Object>

我正在使用C#4.0,因為我希望使用新的差異功能來解決此問題,但到目前為止還沒有運氣。 如果需要更多信息,只需命名! 謝謝你的幫助!

C#4.0中的協方差和協變僅適用於接口和委托。

您必須在類型參數前加上inout前綴,具體取決於接口成員定義中類型參數用法的位置。

例如:

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

因為IDictionary<TKey,TValue>將其類型參數同時用於輸入和輸出,所以字典不是協變的也不是協變的。

來自C#4.0規范草案的方差限制

23.3限制協變量和反變量類型參數只能在接口和委托類型上聲明。 協方差和矛盾方差僅在類型參數之間存在引用(或同一性)轉換時適用。 例如, IEnumerable<int>不是IEnumerable<object>因為從int到object的轉換是裝箱轉換,而不是引用轉換。

您可以將Dictionary定義為私有Dictionary <string,object>,並在從Get方法返回它們之前對對象進行轉換。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM