2010-08-15 107 views
1

我在C#中的產品類,從其他產品類麻煩用明確的轉換

using ExternalAssemb.ProductA; 

public class MyProduct : ProductA 
{ 
    //.... 
} 

我試圖做從產品A有明確的轉換是在我引用的DLL繼承,但它告訴我,這是無法投

MyProduct myProduct = (MyProduct)productAobject; 

結果:: System.InvalidCastException:無法投型 'ExternalAssemb.ProductA' 的對象鍵入 'MyAssembly.MyProduct'。

我在做什麼錯?

回答

5

可以蒙上ProductA參照MyProduct參考,但僅如果它實際指向MyProductA或兒童及其

你在做什麼是試圖對待父母像一個孩子,這是行不通的。相反,你可以像對待父母那樣對待孩子,因爲它像父母一樣

想一個通用的例子,其中基類叫做Shape並且有子例如SquareCircle。給定Shape參考,您可以將任何孩子分配給它。但是,如果參考文獻涉及Circle,則不能將其轉換爲Square。這是有道理的,因爲所有的圓都是形狀,但沒有圓是正方形。

希望這些例子有所幫助。

+0

或者顯式類型轉換操作符的'實現ProductA' – zerkms 2010-08-15 23:14:41

+1

@zerkms:這是真的,但它也是一個與自然繼承不同的事物。沒有什麼能阻止我讓「Aardvark」定義一個明確的演員陣容爲「Building」,但這與Aardvarks實際上並不是建築物無關。相反,'Aarvark'實例必須返回'Building'實例,可能是通過創建一個實例。簡而言之,它看起來像投射,但它不是*真的*投射。 – 2010-08-15 23:17:31

+0

如果我將MyProduct轉換爲ProductA我如何轉到MyProduct屬性。我每次都必須這樣做嗎? ((myProduct的)產品A).MyProductProperty。 – user204588 2010-08-15 23:18:47

1

每個MyProduct也是一個ProductA,但反過來是不正確的。 productAobject是ProductA的顯式實例;它根本不是MyProduct。

同樣,假如其他類:

public class FooProduct : ProductA 
{ 
    //.... 
} 

......你不能這樣做:

ProductA myFooProduct = new FooProduct(); 
MyProduct myProduct = (MyProduct)myFooProduct; 

...因爲FooProduct不從myProduct的繼承。

規則是:您只能將一個類的實例強制轉換爲自己或其祖先類之一。您不能將其轉換爲繼承樹中的任何後代或其他兄弟/表親類。請記住,我們在此討論實例的實際類型。它是什麼類型的變量持有它是無關緊要的。

+0

這沒有錯,但有點誤導。 'ProductA' *類型的引用可能會引用'FooProduct',但是可能不會。這就是爲什麼演員是合法的,但在運行時可能會失敗。 – 2010-08-15 23:19:43

+0

具體而言,您並沒有明確區分引用和實例。 – 2010-08-15 23:20:25

+0

Hi @Steven。我不確定我不清楚的地方;我確實說實例而不是參考(變量)是最終重要的。如果你能解釋,那麼我會適當地編輯我的帖子。 – 2010-08-16 00:26:42

2

很簡單,當你垂頭喪氣,這可能會或可能不會成功,你需要使用is/as運營商檢查的ProductA實例實在是MyProduct

MyProduct myProduct = productAobject as MyProduct; 
if (myProduct != null) { 
    //valid MyProduct instance 
} else { 
    //productAobject is not really an instance of MyProduct 
} 
+1

當然,除非失敗是一個例外,在這種情況下,普通鑄造操作員是最好的。 – 2010-08-15 23:36:07