2011-07-12 73 views
0

以下鑄造工作。我認爲應該,你能向我解釋爲什麼不?無論WebserviceErrorMessageBTMacResponseWebserviceMessage在繼承的分類之間鑄造

 DataLayer.WebserviceMessage msg = new Service.WebserviceErrorMessage(ex) ; 
     DataLayer.BTMacResponse macrsp = (DataLayer.BTMacResponse)msg; 

回答

4

繼承除非從BTMacResponseWebserviceErrorMessage繼承,我不明白爲什麼這應該工作。當對象只是不是 a BTMacResponse時,您正試圖將值賦予BTMacResponse

換句話說,你會期望能夠將FileStream投給MemoryStream,僅僅是因爲他們都繼承了Stream

您是否期望能夠將Button投射到String,僅僅是因爲它們都從Object繼承?

2

你不能這樣。以下是非法的:

class Base { 

} 

class A : Base { 

} 

class B: Base { 
} 

Base someBase = new A(); 
B someB = (B)someBase; 
0

當你創建子實例的對象,你可以不投下去的層次,因爲當你創建父的對象,你不使用它創建的子對象,但是父母被創建,這就是爲什麼你可以向上而不是向下。

在您的情況下,您可以將DataLayer.WebserviceMessage強制轉換爲子級,而不是相反。

0

沒有用於DataLayer.BTMacResponse沒有承包商獲得DataLayer.WebserviceMessage作爲參數,你需要實現這一點:

public BTMacResponse(WebserviceMessage w) 
     { 
       // copy stuff to 'this' 
     } 

     public static implicit operator BTMacResponse(WebserviceMessage w) 
     { 
       BTMacResponse b = new BTMacResponse(w); 
       return b; 
     }