我在下面的代码中得到了“无法从'int'转换为'TValue'”。我怎样才能解决这个问题?我理解为什么会出现问题,但我想知道最好的方法。我是否需要对ReturnValuesDict的特定类型做出决定,而不是将其保留为通用?
public class ReturnValuesDict<TKey, TValue> : CloneableDictionary<TKey, TValue>
{
public static ReturnValuesDict<TKey, TValue> CreateEmptyClone(ReturnValuesDict<TKey, TValue> current)
{
var newItem = new ReturnValuesDict<TKey, TValue>();
foreach (var curr in current)
{
newItem.Add(curr.Key, 0); // ERROR on the 2nd parameter here
}
return newItem;
}
}
答案 0 :(得分:12)
这不编译的原因是0(一个int
)通常不能转换为字典值类型(TValue
),就编译器而言有关,是一些任意类型。 (where TValue : int
不起作用,但这是另一回事)
我假设您正在尝试使用与原始字符相同的键构建字典,但使用“空”值?
如果您认为.NET认为是类型的“默认”值,您可以尝试将该行更改为:
newItem.Add(curr.Key, default(TValue));
这将使用词典值类型的default-value。例如:null
表示引用类型,零表示数值类型。
另一方面,如果目的是编写一个仅适用于具有int
值的字典的方法,则可以使其更具限制性(将其置于另一个类中):
public static ReturnValuesDict<TKey, int> CreateEmptyClone<TKey>(ReturnValuesDict<TKey, int> current)
{
var newItem = new ReturnValuesDict<TKey, int>();
foreach (var curr in current)
{
newItem.Add(curr.Key, 0);
}
return newItem;
}
请注意,该方法现在是一种采用无约束通用TKey
参数的通用方法。