我想要一个可以作为 .ToString() 的替代方法调用的函数,它将显示集合的内容。
我试过这个:
public static string dump(Object o) {
if (o == null) return "null";
return o.ToString();
}
public static string dump<K, V>(KeyValuePair<K, V> kv) {
return dump(kv.Key) + "=>" + dump(kv.Value);
}
public static string dump<T>(IEnumerable<T> list) {
StringBuilder result = new StringBuilder("{");
foreach(T t in list) {
result.Append(dump(t));
result.Append(", ");
}
result.Append("}");
return result.ToString();
}
但是第二个重载永远不会被调用。例如:
List<string> list = new List<string>();
list.Add("polo");
Dictionary<int, List<string>> dict;
dict.Add(1, list);
Console.WriteLine(dump(dict));
我期待这个输出:
{1=>{"polo", }, }
实际发生的是: dict 被正确解释为IEnumerable<KeyValuePair<int, List<string>>>
,因此调用了第三个重载。
第三次重载调用转储 KeyValuePair>。这应该(?)调用第二个重载,但它没有 - 它调用第一个重载。
所以我们得到这个输出:
{[1=>System.Collections.Generic.List`1[System.String]], }
它是由 KeyValuePair 的 .ToString() 方法构建的。
为什么不调用第二个重载?在我看来,运行时应该具有识别具有完整通用参数的 KeyValuePair 并调用该参数所需的所有信息。