C# 无通道的上浇铸场

C# 无通道的上浇铸场,c#,oop,object,field,upcasting,C#,Oop,Object,Field,Upcasting,如何访问上浇铸对象中的字段?我无法使用Console.WriteLine打印Guy对象的SuperPower属性 namespace Test { class Guy { public int Power { get; set; } } class BigGuy : Guy { public int SuperPower { get; set; } } class Program {

如何访问上浇铸对象中的字段?我无法使用Console.WriteLine打印
Guy
对象的
SuperPower
属性

namespace Test
{
    class Guy
    {
        public int Power { get; set; }
    }

    class BigGuy : Guy
    {
        public int SuperPower { get; set; }
    }

    class Program
    {
        static void Main(string[] args)
        {
            Guy guy = new Guy();
            BigGuy bigGuy = new BigGuy();
            bigGuy.SuperPower = 4;
            guy = bigGuy;
            Console.WriteLine(guy.SuperPower); // Visual studio doesn't accept this line.
        }
    }
}
调试时,我收到一个错误:

'Guy' does not contain a definition for 'SuperPower' 

为什么我不能访问
guy.SuperPower
字段?

在访问
biggay
类的字段之前,您必须将
guy
转换为
biggay

Console.WriteLine(((BigGuy)guy).SuperPower);

因为变量的类型是
Guy
。这意味着您只能访问
Guy
类型上声明的属性

想象一下,如果您有第二个子类:

class FastGuy : Guy
{
    public int SpeedPower { get; set; }
}

guy = bigGuy;
guy = new FastGuy();
您可以访问的属性将根据您指定的值而变化。这意味着它不能在编译时进行类型检查


通常,将一个类型声明为某种不太具体的类型的意义在于,这样您就可以像处理该类型一样处理对象,即使具体类型可能是一个子类。

好的,我有点理解,但为什么会有额外的括号,我的意思是为什么控制台.WriteLine((biggay)guy.SuperPower);也不起作用吗?
(biggay)guy.SuperPower
(biggay)(guy.SuperPower)
@K.Zoyar需要额外的括号,否则您将尝试将
guy.SuperPower
的值转换为class
SuperGuy
而不是转换
guy
对象哦,我明白了,谢谢!好的,我不知道您可以通过指定不同的值来更改访问权限,谢谢!