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 を呼び出したときに派生型が認識されることを期待していました。なぜこれがここで起こらないのですか?基本型 (Predicate) の代わりに派生型 (FooPredicate/BarPredicate) を Create に渡す方法はありますか?

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 に答える