1

我在试图理解泛型参数在以下代码场景中的工作方式时遇到了一些麻烦:

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)?

4

2 回答 2

4

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

foreach (dynamic item in list) {
    dynamic o = Create(item);
}
于 2013-07-03T04:44:22.467 回答
2

这是因为您有Predicates. 当您从列表中获取元素时,它仍然只是一个基类。在运行时它将是一个派生类,但在编译期间通用工作。

于 2013-07-03T04:42:06.130 回答