Компилятор должен быть достаточно умен, чтобы признать, что BigFoo
не может быть приведен к IEnumerable<IFoo>
, но это не так. Он просто видит, что это IEnumerable<T>
, и чувствует, что это потенциальный кандидат на перегрузку (даже несмотря на то, что определенное вами ограничение требует, чтобы T
было IFoo
, а int
нельзя было привести к IFoo
). Хотя это неудобно, это не так уж важно. Просто приведите bigFoo к IFoo
, и компилятор будет счастлив:
fooContainer.Add((IFoo)bigFoo);
Кроме того, вы можете сделать общую перегрузку Add uglier:
public void Add<T, U>(U group)
where T : IFoo
where U : IEnumerable<T>
{
}
В любом случае, вам придется больше печатать, второе решение избавляет от необходимости приводить вызовы к Add
, но вам придется явно объявлять тип при вызовах универсального сложения (что в итоге становится большим кодом:
fooContainer.Add<IFoo, IEnumerable<IFoo>>(enumerableFoo);