下面就是问题所在。我想创建一个类,它包含的配置数据。此数据由键/值对。一些例子:“主机名” =“本地主机”,“超时” = 1000,等。我最初的想法是存储所有这些在通用字典:

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

的粗体部分显示错误:

  

无法将类型形态项目到形态项目

我使用C#,因为我使用了新的变化特征希望修复这个问题4.0,但至今没有运气。如果需要了解更多信息,只是名字吧!感谢您的帮助!

有帮助吗?

解决方案

您可以只定义词典私人词典<字符串,对象>,投的对象从您的Get方法返回之前。

其他提示

协变和逆变在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限制 合作和逆变类型参数只能在接口和委托类型来声明。 CO-和逆变仅当存在类型参数之间的参考(或同一性)转换适用。例如,一个IEnumerable<int>不是IEnumerable<object>因为从int转换到对象是装箱转换,而不是引用转换。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top