通用方法写错误

时间:2013-12-30 02:37:51

标签: c# generics generic-programming generic-collections

我正在编写一个泛型方法来打印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。

非常感谢任何帮助(消炎智慧)。

1 个答案:

答案 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 } });