我有两种使用这些签名的方法:
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.
但同样,这几乎肯定是一个坏主意.不要这样做.具有不同语义的两种方法应该具有不同的名称.