为什么 VS2017 在观察视图中观察基础 class 对象时向我显示派生 classes 的成员值?

Why does VS2017 show me the member values of derived classes when I watch the base class object in the watch view?

我有一个 class 层次结构,包含 3 个 classes KlasseA、KlasseB 和 KlasseC。 KlasseC 继承自 KlasseB。 KlasseB 继承自 KlasseA。

这些 class 中的每一个都有各自的 属性 A、B 和 C 类型的 int 以及字段 a、b 和 c:

public class KlasseA
{
    private int a;

    public int A { get => a; set => a = value; }
}
public class KlasseB: KlasseA
{
    private int b;

    public int B { get => b; set => b = value; }
}
public class KlasseC: KlasseB
{
    private int c;

    public int C { get => c; set => c = value; }
}

(我省略了不必要的构造函数和检查逻辑)

现在我可以编写以下代码:

class Program
{
    static void Main(string[] args)
    {
        KlasseA aKlasse;
        KlasseB bKlasse;
        KlasseC cKlasse;
        aKlasse = new KlasseC() { A = 4, B = 5, C = 6 };
        bKlasse = aKlasse as KlasseB;
        cKlasse = aKlasse as KlasseC;
    }

}

当我将 aKlassebKlassecKlasse 添加到手表 window 时,所有 3 个都显示类型为 KlasseC 的值,但是类型分别显示为"KlasseA (KlasseC)""KlasseB (KlasseC)""KlasseC"

展开所有 3 个监视变量后,我可以看到所有 3 个变量中的所有 3 个字段和属性:

-aKlasse    {KlasseC}    KlasseA {KlasseC}
 A          4            int
 B          5            int
 C          6            int
 a          4            int
 b          5            int
 c          6            int
-bKlasse    {KlasseC}    KlasseB {KlasseC}
 A          4            int
 B          5            int
 C          6            int
 a          4            int
 b          5            int
 c          6            int
-cKlasse    {KlasseC}    KlasseC
 A          4            int
 B          5            int
 C          6            int
 a          4            int
 b          5            int
 c          6            int

我认为这是不正确的,因为在代码中我永远不会写

aKlasse.C = aKlasse.A;

即使手表 window 表明 aKlasse 具有属性 A B 和 C。

有人可以证实或反驳我的假设吗?

它向您展示了 执行 时间数据 - 这比仅向您展示您根据编译时已知的内容可以看到的内容要有用得多.基本上,它向您显示 "the object that the variable refers to" - 代码中的对象是 KlasseC,而不管变量的类型如何。

例如,如果您有一个 Stream 类型的变量,但在执行时 实际上 是对 MemoryStream 的引用,您d 希望能够在不使用手表 window 调用 Read 等的情况下轻松查看列表

这不是错误 - 这是一个功能。