使用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窗口,只显示派生类的实现:
有没有办法使用立即窗口来访问类基类的重写成员?
答案 0 :(得分:0)
我认为base.
在课堂外不公开。如果您在类实现之外编写代码,要访问Animal
而不是Ostrich
的属性,那么您将括号转换为Animal
。
((Animal)obj).Name
问题是即使这样仍然会给你ostrich
而不是animal
,因为这正是覆盖应该实现的行为,即你可以访问Name
属性您认为类型为Animal
的对象,但可以在派生类中重写其功能。
从编译器的角度来看,我不确定它的来龙去脉,但如果基本实现的代码甚至没有在编译的Ostrich
中结束,我也不会感到惊讶,除非Ostrich
中有代码访问base.
我同意立即窗口允许您使用base.
然后给出错误答案的事实令人困惑,并且可能是Visual Studio中的错误,除非其他人可以解释这是否有意义。
如果在Ostrich
中包含一些访问base.Name