gpt4 book ai didi

c# - 泛型重载方法解析问题

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

我有两个带有这些签名的方法:

void Method<T>(T data)
{
}

void Method<T>(IEnumerable<T> data)
{
}

它是获取单个对象或对象列表的同一方法的重载。如果我尝试将 List<'T> 传递给它,它会解析为第一种方法,而显然我想要第二种方法。我必须使用 list.AsEnumerable() 让它解析为第二个。有没有办法让它解析为秒,而不管列表的类型是 T[]、IList<'T>、List<'T>、Collection<'T>、IEnumerable<'T> 等

最佳答案

最佳解决方案:一开始就不要去那里。这是一个糟糕的设计。您会注意到没有一个框架类会这样做。列表有两种方法:Add 和 AddRange。第一个添加单个项目,第二个添加一系列项目。

这是一个糟糕的设计,因为您正在编写一个自动产生错误的设备。再次考虑可变列表的示例:

List<object> myqueries = new List<object>();
myqueries.Add(from c in customers select c.Name);
myqueries.Add(from o in orders where o.Amount > 10000.00m select o);

您希望将两个查询添加到查询列表中;如果 Add 被重载以获取序列,那么这会将查询结果添加到列表中,而不是查询。您需要能够区分查询和它的< em>结果;它们在逻辑上是完全不同的。

最好的办法是让方法有两个不同的名字。

如果您一心想做这个糟糕的设计,那么如果这样做会造成伤害,请不要那样做。过载解析旨在找到最佳匹配。不要试图对重载决议施加压力,以使其做一些更糟的事情。同样,这令人困惑且容易出错。 使用其他机制解决问题。例如:

static void Frob(IEnumerable ts) // not generic!
{
foreach(object t in ts) Frob<object>(t);
}
static void Frob<T>(T t)
{
if (t is IEnumerable)
Frob((IEnumerable) t);
else
// otherwise, frob a single T.
}

现在无论用户给你什么 - 一个 T 数组,一个 T 列表数组,无论如何,你最终只会失去单个 T。

但同样,这几乎肯定是个坏主意。不要这样做。具有不同语义的两个方法应该有不同的名称

关于c# - 泛型重载方法解析问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3306627/

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