帮助在C#4.0中使用方差
问题出在这里。我想创建一个包含配置数据的类。此数据由键/值对组成。一些示例:“主机名”=“本地主机”,“超时”=1000,等等。。我最初的想法是将所有这些存储在通用词典中:帮助在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>>(); 专用字典配置= 新字
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,这就是我接下来要做的,尽管我正在寻找一个不需要任何显式转换的解决方案。