如何通过Visual Studio中的立即窗口访问派生类的基类的成员?

时间:2017-03-05 17:34:16

标签: c# visual-studio visual-studio-2013 visual-studio-2015 immediate-window

使用Visual Studio中的Immediate(或Watch)窗口(我正在使用VS2015 Community Edition),可以在中断模式下访问类上的属性或方法。但是,对于从另一个类派生的类,我无法找到一种方法来访问基类的成员,如果它们已在派生类中被覆盖,即使这很容易从代码执行,如下例所示:

public class Program
{
    static void Main(string[] args)
    {
        var ostrich = new Ostrich();
        ostrich.WriteType();
        Console.ReadKey();
    }
}

public class Animal
{
    public void WriteType()
    {
        Console.WriteLine("I'm an {0}", this.Name);
    }

    public virtual string Name => "animal";
}

public class Ostrich : Animal
{
    public override string Name => $"ostrich, not an {base.Name}";
}

如果我运行此代码,输出(显然):

  

我是鸵鸟,不是动物

如果我在Name类的Ostrich属性中设置断点,然后在立即窗口中检查Name属性,输出如下所示:

?this.Name
"ostrich, not an animal"

如果我要求运行基类的实现,我希望输出是“动物”。事实上,我明白了:

?base.Name
"ostrich, not an animal"

这似乎不仅无益,而且实际上是误导性/错误的:我宁愿错误地返回而不是错误的答案。

使用Watch窗口,只显示派生类的实现:

Mini-Watch window screenshot

有没有办法使用立即窗口来访问类基类的重写成员?

1 个答案:

答案 0 :(得分:0)

我认为base.在课堂外不公开。如果您在类实现之外编写代码,要访问Animal而不是Ostrich的属性,那么您将括号转换为Animal

((Animal)obj).Name

问题是即使这样仍然会给你ostrich而不是animal,因为这正是覆盖应该实现的行为,即你可以访问Name属性您认为类型为Animal的对象,但可以在派生类中重写其功能。

从编译器的角度来看,我不确定它的来龙去脉,但如果基本实现的代码甚至没有在编译的Ostrich中结束,我也不会感到惊讶,除非Ostrich中有代码访问base.

我同意立即窗口允许您使用base.然后给出错误答案的事实令人困惑,并且可能是Visual Studio中的错误,除非其他人可以解释这是否有意义。

如果在Ostrich中包含一些访问base.Name

的代码,那么看看立即窗口的行为会很有趣