我有一个非常简单的递归定义函数,它打印出任何列表的内容,定义如下;
static string ShowList<T>(IEnumerable<T> iterable)
{
return "[" + string.Join(", ", iterable.Select(e => ShowList(e))) + "]";
}
static string ShowList(string str)
{
return $"\"${str}\"";
}
static string ShowList<T>(T elem)
{
return elem.ToString();
}
如您所见,最低覆盖是一个适用于任何参数的catch all。最高重载仅适用于可枚举的参数。理想情况下,我希望它首先检查并运行最具体的重载,然后如果它们都失败,则使用一般情况。但我发现它总是直接针对一般情况,并打印出Systems.Generic.Containers.List1[]
。是否有可能给某些重载优先于其他重载,以便编译器会在其他之前自动尝试?
答案 0 :(得分:0)
在我看来,因为e
(在iterable.Select的委托中)是T类型,所以编译器将使用类型T重载。我建议,因为它只是返回ToString()方法,消除它并将委托中的调用更改为ShowList(e.ToString())
。如果ToString()被重载,你很可能获得有意义的数据,否则你将获得对象类型数据。
至于发送List<List<T>>
,您需要一个不接受它的不同重载。