【发布时间】:2017-04-01 10:55:32
【问题描述】:
我有一个非常简单的递归定义函数,可以打印出任何定义的列表的内容;
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[]。是否可以赋予某些重载比其他重载更高的优先级,以便编译器会在其他重载之前自动尝试这些重载?
【问题讨论】:
-
我不认为你的函数在定义上是递归的
-
@Jonesopolis 查看第 3 行的递归调用
-
我猜如果 T 本身是 IEnumerable 的话,好吧
-
@Maurdekye 不,它不是递归的。一个重载调用另一个重载。任何重载都不能调用自己,因此该函数实际上不是递归的。
-
@Maurdekye 多个重载不能应用于单个值。正如我在之前的评论中解释的那样,从有问题的调用站点中,只有一个有效的重载,因此使用了重载。此外,如果存在 多个适用的重载(在您的代码中从未发生过), 实际上对于重载的“更好”有严格的规则,你如果您想了解它们是什么,可以免费查看语言规范。它们不是“随机”选择的。
标签: c# generics overloading