当作为泛型参数传递时,为什么通用类型不被识别为其派生类型?

时间:2013-07-03 04:35:50

标签: c# generics

我在尝试围绕通用参数如何在以下代码场景中工作时遇到了一些麻烦:

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而不是派生类型。我知道这是因为列表中的对象存储为Predicates。但是,我希望在调用Create时可以识别派生类型。为什么不在这里发生?有没有什么方法可以将派生类型(FooPredicate / BarPredicate)传递给Create而不是基类型(Predicate)?

2 个答案:

答案 0 :(得分:4)

使用动态类型执行重载解析的最简单方法是使用dynamic关键字。

foreach (dynamic item in list) {
    dynamic o = Create(item);
}

答案 1 :(得分:2)

这是因为你有Predicates的列表。从列表中获取元素时,它仍然只是一个基类。在运行时它将是一个派生类,但泛型在编译时起作用。