我有一个通用的集合克隆实用程序,如下所示:
public static TColl CloneCollection<TColl, TItem>(this TColl collection)
where TColl : ICollection<TItem>, new()
where TItem : ICloneable
{
TColl newCollection = new TColl();
collection.ForEach(item => newCollection.Add((TItem) item.Clone()));
return newCollection;
}
出于某种原因,在这种情况下,类型推断感觉比平常更笨。我期待它能像这样工作:
List<Fruit> f = GetSomeFruit();
List<Fruit> f2 = f.CloneCollection();
但我得到“方法的类型参数'Collections.CloneCollection(TColl)'无法从用法中推断出来。请尝试明确指定类型参数”。
相反,我必须这样做:
List<Fruit> f2 = f.CloneCollection<List<Fruit>, Fruit>(fruits);
有人可以解释编译器何时可以推断出参数以及什么时候不能推断出参数,具体而言,上面的例子显然让编译器被欺骗了?