我正在编写一个泛型方法来打印C#字典中的键值对;我认为它最好开始指出要掌握这种类型的集合的有用性(正如我在Java中使用HashMaps所做的那样)。
这里有两种方法可供使用:
ListWordCount(string text){// Code body}
// Returns a Dictionary<string, int> with the number of occurrences
// Works exactly as intended (its from one of my textbooks)
问题方法:
public static void PrintKeyValuePairs(Dictionary<IComparable, IComparable> dict)
{
foreach (KeyValuePair<IComparable, IComparable> item in dict)
{
Console.WriteLine("{0}: {1}", item.Key, item.Value);
}
}
// ... Some lines later
PrintKeyValuePairs( ListWordCount("Duck, duck, duck, goose") ); // Where we get the error
我被告知的当前错误是:
//"Argument 1:
//Cannot convert from 'System.Collections.Generic.Dictionary<string, int>' to
//'System.Collections.Generic.Dictionary<System.IComparable,System.IComparable>' "
..最后我检查过,字符串和int都实现了'IComparable',所以我可能会误解继承性质,但是我之前做过非常相似的事情,而不是泛型有效。我想知道如何纠正这个问题,以便我可以在将来防止这种类型转换错误,或者只是更好的方法来编写这个通用逻辑。
如果重要,我在Windows 8.1计算机上使用Visual Studio 2013。
非常感谢任何帮助(消炎智慧)。
答案 0 :(得分:2)
对于通用where clause,您可以按如下方式定义:
public static void PrintKeyValuePairs<T, U>(Dictionary<T, U> dict)
where T : IComparable
where U : IComparable
{
foreach (KeyValuePair<T, U> item in dict)
{
Console.WriteLine("{0}: {1}", item.Key, item.Value);
}
}
使用Dictionary<string, int>
调用它没有错误:
PrintKeyValuePairs(new Dictionary<string, int> { { "duck", 4 }, { "goose", 5 } });