沒有,因爲在從B
C
繼承,A<C>
不從A<B>
繼承。
要理解爲什麼是這樣的話,想象一下,如果A<T>
是不是List<T>
:
class B { }
class C : B { }
class D : B { }
class My1 {
public My1(List<B> lessDerivedTemplateParameter)
{
// This is totally legal
lessDerivedTemplateParameter.Add(new D());
}
}
class My2 : My1 {
public My2(List<C> moreDerivedTemplateParameter)
// if this were allowed, then My1 could add a D to a list of Bs
: base(moreDerivedTemplateParameter)
{
}
}
現在,在另一方面,這是合法的:
interface IA<out T> {
public T GetSome();
}
class B { }
class C : B { }
class D : B { }
class My1 {
public My1(IA<B> lessDerivedTemplateParameter)
{
// This is totally legal
var someB = lessDerivedTemplateParameter.GetSome();
}
}
class My2 : My1 {
public My2(IA<C> moreDerivedTemplateParameter)
// This is allowed, because an A<C> only *produces* C's (which are also B's)
// so the base class (which consumes B's, and doesnt care if they are C's)
// can use an IA<C>
: base(moreDerivedTemplateParameter)
{
}
}
我不那麼流利的泛型varian因爲這是一個評論,而不是一個答案,但我認爲你需要將'A'定義爲'A '來進行編譯。 –
psubsee2003
@ psubsee2003:我相信只能用於接口。 – Douglas
有趣的是,我做了你的建議加上必須使A和界面,然後它編譯...我會繼續前進,看看我是否可以得到同樣的結果我以後,謝謝... –