ここで使用する正しいオーバーロードをコンパイラが解決できない理由がわかりません。(以下のコード) 適切な Add() のバージョンは 1 つだけです。BigFoo は IFoo であり、T が IFoo である IEnumerable を実装していません。しかし、それはあいまいさを報告することを主張しています。何か案は?2 番目のジェネリック型パラメーターを追加してみました - Add where T : IFoo where U : IEnumerable. ただし、過負荷は、正当な使用であっても完全に無視されます。
ジェネリック型パラメーターをキャストして指定することでこれを回避できることはわかっていますが、その時点で、オーバーロードを持つ目的を無効にしました。オーバーロードに疑問を呈することもできますが、セマンティクスは私には正しいと感じています。クラスで実装している動作は、Add() の両方がオブジェクトをホールセールとしてコレクションに個別のエントリとして追加することです。(2 番目の Add() は AddRange() であってはなりません。)
namespace NS
{
interface IFoo { }
class BigFoo : IFoo, IEnumerable<int>
{
public IEnumerator<int> GetEnumerator()
{
throw new NotImplementedException();
}
IEnumerator IEnumerable.GetEnumerator()
{
throw new NotImplementedException();
}
}
class FooContainer
{
public void Add(IFoo item) { }
public void Add<T>(IEnumerable<T> group) where T : IFoo { }
}
class DemoClass
{
void DemoMethod()
{
BigFoo bigFoo = new BigFoo();
FooContainer fooContainer = new FooContainer();
// error CS0121: The call is ambiguous between the following methods or properties:
// 'NS.FooContainer.Add(NS.IFoo)' and
// 'NS.FooContainer.Add<int>(System.Collections.Generic.IEnumerable<int>)'
fooContainer.Add(bigFoo);
}
}
}