我在试图理解泛型参数在以下代码场景中的工作方式时遇到了一些麻烦:
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 时能够识别派生类型。为什么这里不发生这种情况?有什么方法可以让派生类型 (FooPredicate/BarPredicate) 传递给 Create 而不是基类型 (Predicate)?