使用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"这似乎不仅无济于事,而且实际上是误导/不正确的:我宁愿返回错误而不是错误的答案。使用监视窗口,仅显示派生类的实现:有什么方法可以使用即时窗口访问类的基类的重写成员? 最佳答案 我认为base.在课外无法公开获得。如果要在类实现之外编写代码,则要访问Animal而不是Ostrich的属性,则可以将其括弧移植到Animal。((Animal)obj).Name问题在于,即使这仍然会给您ostrich而不是animal,因为这正是应该实现的覆盖行为,即您可以访问您认为类型的对象的Name属性Animal,但可以在派生类中覆盖其功能。从编译器的角度来看,我不确定它的来龙去脉,但是如果基本实现的代码甚至没有出现在编译后的Ostrich中,也不会令我感到惊讶,除非访问Ostrich我同意“即时”窗口允许您使用base.然后给出错误答案的事实令人困惑,并且有可能是Visual Studio中的错误,除非其他人可以解释这是怎么回事。如果您在base.中包含一些访问Ostrich的代码,那么看看即时窗口的行为将很有趣。关于c# - 如何通过Visual Studio中的“即时”窗口访问派生类的基类的成员?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/42611663/
10-10 22:30