2017-07-22 47 views
0

如何访问UpCasted对象中的字段?我不能使用Console.WriteLine为了打印Guy对象无法访问的UpCasted字段

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. 
     } 
    } 
} 

当我调试的SuperPower财产,我得到一个错误:

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

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

回答

0

你有BigGuy类的访问字段之前投guyBigGuy

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

好吧,我有点明白,但为什么会有addicional括号,我的意思是为什么Console.WriteLine((BigGuy)guy.SuperPower);也不起作用? –

+0

'(BigGuy)guy.SuperPower'与'(BigGuy)(guy.SuperPower)' – Lovy

+0

@ K.Zoyar一样需要额外的括号,否则你会尝试将'guy.SuperPower'的值转换为SuperGuy类'而不是铸造'家伙'对象 – opewix

0

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

试想一下,如果你有一个第二子类:

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

guy = bigGuy; 
guy = new FastGuy(); 

的属性,你将能够访问将取决于你什么分配值更改。这意味着它不能在编译时进行类型检查。

通常,将类型声明为某种较不具体的类型的意义在于,您可以像对待该类型一样对该对象执行操作,即使具体类型可能是子类。

+0

好吧,我不知道你可以通过分配不同的值来改变访问权限,谢谢! –