题
下面就是问题所在。我想创建一个类,它包含的配置数据。此数据由键/值对。一些例子:“主机名” =“本地主机”,“超时” = 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只适用于接口和委托。
您必须in
或out
前缀类型参数,这取决于在该接口构件的定义类型参数的用法的位置。
例如:
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转换到对象是装箱转换,而不是引用转换。
不隶属于 StackOverflow