他の方の回答を参考にさせていただきたいと思います。
と の間には違いがTest(IFoo foo)ありTest<T>(T foo) where T : IFooます。List<object>(または、たとえばArrayListを受け取るobject) との間に大きな違いがあるように、実際の違いがありList<string>ます。
Test (IFoo foo)は、 と同様に、ポリモーフィズムと型継承の利点を提供しますList<object>。すべてのタイプを処理する 1 つのクラスを作成できますIFoo。しかし、ポリモーフィズムだけではなく、文字列のみを保持できるリストがList<string>必要な場合もありますArrayList。
あなたのコードも同じです。私が持っているとしましょうclass Comparer<T> where T:IFoo。このクラスを使用して、Foo1オブジェクトを相互に比較したり、相互に比較したりしたいのですが、 と比較しFoo2たくありません。強く型付けされたジェネリック メソッドはそれを強制しますが、ポリモーフィック メソッドはそうしません:Foo1Foo2
public class Comparer
{
public bool Compare1<T>(T first, T second) where T : IFoo {...}
public bool Compare2 (IFoo first, IFoo second) {...}
}
Foo1 first = new Foo1();
Foo2 second = new Foo2();
myComparer.Compare1(first, second); // won't compile!
myComparer.Compare2(first, second); // Compiles and runs.