gpt4 book ai didi

使用 IList 和 IReadOnlyList 的 C# 重载解析

转载 作者:太空狗 更新时间:2023-10-29 20:26:37 26 4
gpt4 key购买 nike

我有一个方法,我想在我的解决方案中获取所有类似列表的对象。在 .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
}

... 但是这不会为实现这两个接口(interface)( T[]List<T> 和许多其他类型)的任何东西编译,因为编译器无法确定使用哪种方法(特别烦人,因为它们有相同的 body ,所以没关系)。

我不想添加 Method 的重载需要 T[] , 和 List<T> ,以及实现这两个接口(interface)的所有其他类型。

我应该如何完成这个?

最佳答案

这可能是实际检查运行时类型有用的情况之一:

public static T Method<T>(IEnumerable<T> source)
{
if (source is IList<T> list)
return Method(list);

if (source is IReadOnlyList<T> readOnly)
return Method(readOnly);

return Method(source.ToList() as IList<T>);
}

private static T Method<T>(IReadOnlyList<T> list) { ... }
private static T Method<T>(IList<T> list) { ... }

您仍然需要复制代码,因为您需要为 IListIReadOnlyList 单独实现,因为没有可以利用的公共(public)接口(interface),但您至少可以避免模糊调用问题。

关于使用 IList<T> 和 IReadOnlyList<T> 的 C# 重载解析,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49489080/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com