他の方の回答を参考にさせていただきたいと思います。
と の間には違いが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
たくありません。強く型付けされたジェネリック メソッドはそれを強制しますが、ポリモーフィック メソッドはそうしません:Foo1
Foo2
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.