在c#中将基类动态转换为子类
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在c#中将基类动态转换为子类相关的知识,希望对你有一定的参考价值。
我有一个基类和两个子类,其中一个类有其他字段。该函数将基类作为参数并在运行时将其强制转换为子类,但将基类转换为类B会产生错误
public class Base {
int x
}
public class A :Base {
A() { x= 5;}
}
public class B :Base {
int y ;
B() { x=5
y=5;
}
}
在运行时将基类转换为子类时,会抛出无效的转换操作错误
public int getValue(Base base) {
A a = base as A //works fine
B b = base as B // throws invalid cast opertions
return (a.x + b.x + b.y)
}
它应该工作,因为这两个类都继承自base,但是无法弄清楚为什么它在B类上失败了。
这是为什么?
答案
这是非常逻辑的,只有当base的实例是B类时,才能进行强制转换。我做了一个小例子来更好地解释这个:
public class BaseClass
{
public int x { get; set; }
}
public class A : BaseClass
{
public A() { x = 5; }
}
public class B : BaseClass {
public int y { get; set; }
public B()
{
x = 5; y = 5;
}
}
class Program
{
static void Main(string[] args)
{
BaseClass bClase = new BaseClass();
A a = bClase as A; //a = null
B b = bClase as B; // c = null
BaseClass bClase2 = new A();
A a2 = bClase2 as A; //works fine
B b2 = bClase2 as B; // b2 = null
BaseClass bClase3 = new B();
A a3 = bClase3 as A; // b2 = null
B b3 = bClase3 as B; //works fine
//Cast down = ok
BaseClass bb = bClase3 as BaseClass;
}
}
PS:为了将来使用stackoverflow,请提供工作代码。让您的助手更轻松。
以上是关于在c#中将基类动态转换为子类的主要内容,如果未能解决你的问题,请参考以下文章
C++ VS代码爆红:不允许对不可访问的基类进行转换(子类继承父类时必须加上继承属性,比如public)
C++ VS代码爆红:不允许对不可访问的基类进行转换(子类继承父类时必须加上继承属性,比如public)