帮助在C#4.0中使用方差

帮助在C#4.0中使用方差,c#,c#-4.0,variance,C#,C# 4.0,Variance,问题出在这里。我想创建一个包含配置数据的类。此数据由键/值对组成。一些示例:“主机名”=“本地主机”,“超时”=1000,等等。。我最初的想法是将所有这些存储在通用词典中: private Dictionary<string, ConfigurationItem<object>> Configuration = new Dictionary<string, ConfigurationItem<object>>(); 专用字典配置= 新字

问题出在这里。我想创建一个包含配置数据的类。此数据由键/值对组成。一些示例:“主机名”=“本地主机”,“超时”=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; }
}
公共类配置项
{
公共字符串名称{get;set;}
公共T值{get;set;}
}
我希望可以查询并设置如下配置:

int i = Configuration.Get<int>("Timeout");
Configuration.Set("Timeout", 1000);
inti=Configuration.Get(“超时”);
设置(“超时”,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**);
}
public void设置值(字符串键,配置项值)
{
if(Configuration.ContainsKey(key.ToUpper()))
配置[key.ToUpper()]=**值**;
其他的
Configuration.Add(key.ToUpper(),**值**);
}
粗体部分显示错误:

无法将类型ConfigurationItem转换为ConfigurationItem


我正在使用C#4.0,因为我希望使用新的方差特性来解决这个问题,但到目前为止运气不佳。如果需要更多信息,请说出它的名称!谢谢你的帮助

C#4.0中的协方差和逆变仅适用于接口和委托

根据类型参数在接口成员定义中的用法位置,必须在类型参数前面加上
in
out

例如:

public interface IConfigurationItem<out T>
{
    public string Name { get; set; }
    public T Value { get; set; }
}
公共接口IConfigurationItem
{
公共字符串名称{get;set;}
公共T值{get;set;}
}
因为
IDictionary
将其类型参数用于输入和输出,所以字典不是协变或逆变的。

来自C#4.0草案规范差异限制

23.3限制
协变量和逆变类型参数只能在接口和委托类型上声明。协方差和逆变仅在类型参数之间存在引用(或标识)转换时适用。例如,
IEnumerable
不是
IEnumerable
,因为从int到object的转换是装箱转换,而不是引用转换。

您可以将字典定义为私有字典,并在从Get方法返回对象之前强制转换对象。

谢谢Lance,这就是我接下来要做的,尽管我正在寻找一个不需要任何显式转换的解决方案。