1

这就是问题所在。我想创建一个包含配置数据的类。该数据由键/值对组成。一些示例:“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,因为我希望使用新的方差特性来解决这个问题,但到目前为止还没有运气。如果需要更多信息,只需命名!谢谢你的帮助!

4

3 回答 3

2

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

您必须在类型参数前面加上inor out,具体取决于接口成员定义中类型参数的使用位置。

例如:

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

因为IDictionary<TKey,TValue>将其类型参数用于输入和输出,所以字典不是协变或逆变的。

于 2009-09-27T16:59:40.217 回答
1

从 C# 4.0 草案规范变化限制

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

于 2009-09-27T17:17:14.763 回答
0

You could just define your Dictionary as private Dictionary<string, object>, and cast the objects before you return them from your Get method.

于 2009-09-27T17:24:59.743 回答