違いは何ですか
Foo<T> where T : BaseObject
と
Foo<BaseObject>
この発言は同じではないか。
いいえ、同じではありません。
と:
Foo<T> where T : BaseObject
T
任意のBaseObject
型とその継承者にすることができます。
と:
Foo<BaseObject>
T
正確である必要があります (ジェネリック型パラメーターに対してBaseObject
バリアンス修飾子が宣言されていないと仮定します)。Foo
このことを考慮:
var list = new List<object>();
list.Add("Hello");
Console.WriteLine(list[0].Length); // doesn't compile
同様に、Foo<BaseObject>
の場合、Foo のコンシューマーは、Foo のメンバーから BaseObject メンバーにのみアクセスできますT
。 With Foo<T> where T : BaseObject
、Foo のコンシューマーは、型引数に実際に渡された派生型のすべてのメンバーにアクセスできます。