以下鑄造工作。我認爲應該,你能向我解釋爲什麼不?無論WebserviceErrorMessage
和BTMacResponse
從WebserviceMessage
類在繼承的分類之間鑄造
DataLayer.WebserviceMessage msg = new Service.WebserviceErrorMessage(ex) ;
DataLayer.BTMacResponse macrsp = (DataLayer.BTMacResponse)msg;
以下鑄造工作。我認爲應該,你能向我解釋爲什麼不?無論WebserviceErrorMessage
和BTMacResponse
從WebserviceMessage
類在繼承的分類之間鑄造
DataLayer.WebserviceMessage msg = new Service.WebserviceErrorMessage(ex) ;
DataLayer.BTMacResponse macrsp = (DataLayer.BTMacResponse)msg;
繼承除非從BTMacResponse
WebserviceErrorMessage
繼承,我不明白爲什麼這應該工作。當對象只是不是 a BTMacResponse
時,您正試圖將值賦予BTMacResponse
。
換句話說,你會期望能夠將FileStream
投給MemoryStream
,僅僅是因爲他們都繼承了Stream
?
您是否期望能夠將Button
投射到String
,僅僅是因爲它們都從Object
繼承?
你不能這樣。以下是非法的:
class Base {
}
class A : Base {
}
class B: Base {
}
Base someBase = new A();
B someB = (B)someBase;
當你創建子實例的對象,你可以不投下去的層次,因爲當你創建父的對象,你不使用它創建的子對象,但是父母被創建,這就是爲什麼你可以向上而不是向下。
在您的情況下,您可以將DataLayer.WebserviceMessage強制轉換爲子級,而不是相反。
沒有用於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;
}