3

使用 Visual Studio 中的即时(或监视)窗口(我使用的是 VS2015 社区版),可以在中断模式下访问类的属性或方法。但是,对于从另一个类派生的类,如果基类的成员已在派生类中被覆盖,我将找不到访问基类成员的方法,即使从代码中可以直接执行此操作,如本示例所示:

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 窗口,只显示派生类的实现:

迷你手表窗口截图

有什么方法可以使用立即窗口来访问类基类的被覆盖成员?

4

1 回答 1

0

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

((Animal)obj).Name

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

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

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

Ostrich如果您在其中包含一些访问的代码,那么看看立即窗口的行为会很有趣base.Name

于 2017-03-06T08:28:23.747 回答