我有一些麻煩,試圖總結我的周圍是如何通用參數預計頭在下面的代碼情況下工作:作爲泛型參數傳遞時,爲什麼泛型類型不被識別爲其派生類型?
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);
}
}
}
當調用創建,泛型類型T總是被設置爲代替謂詞派生類型。我明白這是因爲列表中的對象被存儲爲Predicates。但是,我期望在調用Create時可以識別派生類型。爲什麼這不會發生在這裏?有什麼辦法可以讓派生類型(FooPredicate/BarPredicate)被傳遞到Create而不是基類型(Predicate)?
有趣!它爲什麼這樣工作? – csano
+1。它確實創造出正確的類型 - 謝謝! (比'MakeGenericType'代碼容易得多)。 –
同意。這是一個漂亮的伎倆。試圖找出究竟如何(以及爲什麼)它的工作原理! – csano