通用重载方法解析问题

use*_*689 7 c#

我有两种使用这些签名的方法:

void Method<T>(T data)
{
}

void Method<T>(IEnumerable<T> data)
{
}
Run Code Online (Sandbox Code Playgroud)

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

Eri*_*ert 10

最好的解决方案:首先不要去那里.这是一个糟糕的设计.您会注意到没有任何框架类可以做到这一点.列表有两种方法: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);
Run Code Online (Sandbox Code Playgroud)

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

最好的办法是使方法有两个不同的名称.

如果你对这个糟糕的设计很不满意,那么当你这样做时会受到伤害,不要这样做.过载分辨率旨在找到最佳匹配.不要试图锤击过载分辨率,以便它做得更糟.再次,这是令人困惑和容易出错的.使用其他一些机制解决问题.例如:

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.
}
Run Code Online (Sandbox Code Playgroud)

现在无论用户给你什么 - 一个T数组,一个T列表数组,无论如何,你最终只会擦拭单个Ts.

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