【发布时间】:2018-03-26 10:18:35
【问题描述】:
我有一个方法,我想在我的解决方案中获取所有类似列表的对象。在 .NET 4.5 之前,这很简单:
public static T Method<T>(IList<T> list)
{
// elided
}
但是,.NET 4.5 引入了IReadOnlyList<T>,这个方法也应该适用于它。
我不能只将签名更改为采用IReadOnlyList<T>,因为有些地方我将该方法应用于专门键入为IList<T> 的内容。
该算法无法在 IEnumerable<T> 上运行,而且它使用得太频繁(并且对象太大)而无法在每次调用时获取 IEnumerable<T> 并创建一个新的 List<T>。
我尝试过添加重载:
public static T Method<T>(IReadOnlyList<T> list)
{
// elided
}
... 但这不会为实现两个接口(@987654330@、List<T> 和许多其他类型)的任何东西编译,因为编译器无法确定使用哪种方法(特别烦人,因为他们有相同的身体,所以没关系)。
我不想添加采用T[] 和List<T> 的Method 的重载,以及实现这两个接口的所有其他类型。
我应该如何做到这一点?
【问题讨论】:
-
使用
IEnumerable<T>?或ICollection<T>如果您希望能够指定集合应该支持添加/删除操作 -
除非你使用
IEnumerable<T> -
IList<T> and IReadOnlyList<T> 的可能副本 - 不是目标的精确重复,而是相同的潜在问题以及答案中的大量解决方法和想法。
-
如果一切都在一个解决方案中,那就幸运了。在这种情况下,只需搜索替换并编译。修复所有错误。完成。
-
您可以接受
IEnumerable<T>但检查传递的内容是否实现了IList或IReadOnlyList或您可能需要的任何其他接口。如果确实如此 - 使用IList或IReadOnlyList做任何你需要的事情。如果没有 - 从IEnumerable构造新的List并用它做你需要的事情。这样你就不会因为在不必要的时候从IEnumerable构建新列表而受到性能损失。
标签: c# overloading overload-resolution