C# - 代码有什么问题(泛型,静态方法等)

时间:2010-10-04 04:14:48

标签: c# .net generics

我在下面的代码中得到了“无法从'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;
    }

}

1 个答案:

答案 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参数的通用方法。