比方說,我們有這幾種:C#泛型鑄造型兒童向母公司
class A {}
class B : A {}
class X<T> {}
爲什麼我們不能做到這一點?
X<A> var = new X<B>();
是否有任何解決方法可用?
[編輯] 我試圖用協方差,但失敗了,因爲我想訪問內部X是T型和C#的屬性在接口用T類型不允許:
interface IX<out T> {
T sth {set; get;}
}
class X<T>: IX<T> {
T sth { set; get; }
}
[編輯2] 我也試過,但它失敗:
class X<T> where T : A
{
public T sth { set; get; }
public static implicit operator X<T>(X<B> v)
{
return new X<T>
{
sth = v.sth,
};
}
}
很奇怪的是,C#不允許鑄造的「某事」。
在__ [編輯2] __,當你說'新X {...}',記住'T'可以與任何具體類型時,可以取代這運行。例如,如果'T'碰巧是'class Evil:A'類型的呢?然後,將類型爲'B'的'v.sth'分配到'Evil'類型的屬性中。但他們沒有兼容的類型。它們之間唯一的「關係」('B'和'Evil')是從'A'派生出來的。所以'B'不是'Evil',所以分配是非法的。由於分配對於一些「T」的替換是非法的,因此分配通常是非法的。 –
@JeppeStigNielsen你說得對[編輯2] – HamedH