继承类之间的转换

时间:2011-07-12 14:25:30

标签: c# casting

以下演员表不起作用。我认为应该,你能解释一下为什么不呢? WebserviceErrorMessageBTMacResponse都继承自WebserviceMessage

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

4 个答案:

答案 0 :(得分:4)

除非WebserviceErrorMessage继承自BTMacResponse,否则我不明白为什么这应该有效。当对象只是不是 a BTMacResponse时,您正试图将值转换为BTMacResponse

换句话说,您是否希望能够将FileStream投放到MemoryStream,因为它们都是从Stream继承而来的?

您是否希望能够将Button投放到String,因为它们都是从Object继承而来的?

答案 1 :(得分:2)

你不能这样投。以下是非法的:

class Base {

}

class A : Base {

}

class B: Base {
}

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

答案 2 :(得分:0)

您无法强制转换层次结构,因为在创建父对象时,您不会使用它创建子对象,但是当您创建子对象时,会创建父对象的实例,这就是为什么您可以向上而不是低垂。

在您的情况下,您可以将DataLayer.WebserviceMessage强制转换为其子级而不是相反的。

答案 3 :(得分: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;
        }