在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)

C++ VS代码爆红:不允许对不可访问的基类进行转换(子类继承父类时必须加上继承属性,比如public)

C#:将基类转换为子类

将子类转换为基类?

将基类指针强制转换为子类指针后的疑惑