次のコード シナリオで、ジェネリック パラメーターがどのように機能すると予想されるかについて頭を悩ませようとしているのですが、問題があります。
class Predicate { }
class BarPredicate : Predicate { }
class FooPredicate : Predicate { }
class Program {
private static IPredicateHandler<T> Create<T>(T t) where T : Predicate
{
// T is always Predicate
}
static void Main(string[] args)
{
var list = new List<Predicate>() {new FooPredicate(), new BarPredicate()};
foreach (var item in list)
{
var o = Create(item);
}
}
}
Create を呼び出すと、ジェネリック型 T は常に派生型ではなく Predicate に設定されます。これは、リスト内のオブジェクトが述語として格納されているためだと理解しています。ただし、Create を呼び出したときに派生型が認識されることを期待していました。なぜこれがここで起こらないのですか?基本型 (Predicate) の代わりに派生型 (FooPredicate/BarPredicate) を Create に渡す方法はありますか?