" base"的属性值在调试器中

时间:2017-03-16 15:06:11

标签: c# .net visual-studio-debugging

我正在调试以下代码:

class A 
{
    public virtual string X => "A";
}

class B : A
{
    public bool OwnX { get; set; } = true;
    public override string X
        => OwnX ? "B" : base.X; // (o)
}

class Program
{
    static void Main() => Console.WriteLine(new B().X);
}

我在标有(o)的行上有一个断点。当断点出现时,我试图评估base.X并获取其值"B"

strage base.X value?

问题是:为什么不"A"

3 个答案:

答案 0 :(得分:-1)

这是罗斯林的臭虫

正如其他人所提到的,此错误是well known

您可以轻松检查base.X的实际值是 A ,只是表达式计算器返回错误的结果:

This one is in Rider

答案 1 :(得分:-1)

由于X不在运行时求值,因此它也不会在调试器中求值。因此,假设它是相同的。

由于未实际调用base.X,因此从未将其评估为A。覆盖属性是由于该前导。

如果您愿意,可以使用常量。

答案 2 :(得分:-6)

也许你应该多读一点这个?:运营商 https://docs.microsoft.com/en-us/dotnet/articles/csharp/language-reference/operators/conditional-operator

由于默认值OwnX为真。

尝试使用此代码:

 B b = new B();
 b.OwnX = false;
 Console.WriteLine(b.X);

解释此代码:     公共覆盖字符串X.         => OwnX? “B”:base.X;

使其更具可读性:

public override string X
{
   get {
      if (Ownx == true) // this is the default value.
      {
          return "B";
      }
      else{
          return "A";
      }
}