Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/268.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 呼唤;“碱性吸气剂”;在重写属性的Getter时_C#_Properties_Virtual_Overriding_Getter - Fatal编程技术网

C# 呼唤;“碱性吸气剂”;在重写属性的Getter时

C# 呼唤;“碱性吸气剂”;在重写属性的Getter时,c#,properties,virtual,overriding,getter,C#,Properties,Virtual,Overriding,Getter,我有这样一个基类“Parent”: using System; using System.Collections.Generic; using System.Text; namespace ConsoleApplication1 { class Parent { private int parentVirtualInt = -1; public virtual int VirtualProperty { g

我有这样一个基类“Parent”:

using System;
using System.Collections.Generic;
using System.Text;

namespace ConsoleApplication1
{
    class Parent
    {
        private int parentVirtualInt = -1;
        public virtual int VirtualProperty
        {
            get
            {
                return parentVirtualInt;
            }
            set
            {
                if(parentVirtualInt != value)
                {
                    parentVirtualInt = value;
                }
            }
        }
    }
}
using System;
using System.Collections.Generic;
using System.Text;

namespace ConsoleApplication1
{
    class Child : Parent
    {
        public override int VirtualProperty
        {
            get
            {
                if(base.VirtualProperty > 0)
                {
                    throw new ApplicationException("Dummy Ex");
                }
                return base.VirtualProperty;
            }
            set
            {
                if(base.VirtualProperty != value)
                {
                    base.VirtualProperty = value;
                }
            }
        }
    }
}
还有这样一个儿童班:

using System;
using System.Collections.Generic;
using System.Text;

namespace ConsoleApplication1
{
    class Parent
    {
        private int parentVirtualInt = -1;
        public virtual int VirtualProperty
        {
            get
            {
                return parentVirtualInt;
            }
            set
            {
                if(parentVirtualInt != value)
                {
                    parentVirtualInt = value;
                }
            }
        }
    }
}
using System;
using System.Collections.Generic;
using System.Text;

namespace ConsoleApplication1
{
    class Child : Parent
    {
        public override int VirtualProperty
        {
            get
            {
                if(base.VirtualProperty > 0)
                {
                    throw new ApplicationException("Dummy Ex");
                }
                return base.VirtualProperty;
            }
            set
            {
                if(base.VirtualProperty != value)
                {
                    base.VirtualProperty = value;
                }
            }
        }
    }
}
注意,Child中的getter正在调用Parent的getter(或者至少这是我想要的)

我现在通过实例化“Child”类来使用它,为其VirtualProperty分配一个值(比如4),然后再次读取该属性

Child c = new Child();
c.VirtualProperty = 4;
Console.Out.WriteLine("Child.VirtualProperty: " + c.VirtualProperty);
当我运行这个程序时,我明显得到一个ApplicationException,上面写着“Dummy Ex”但是如果我在行上设置断点

if(base.VirtualProperty > 0)
在Child中,检查
base.VirtualProperty
(将鼠标悬停在其上)的值。在抛出异常之前(我假设(d)),我已经得到了异常。由此,我传达了“Child Getter调用自身”中的语句
base.VirtualProperty
;有点

我想要实现的是,当我将
parentVirutalInt
(在Parent中)的定义更改为protected并在Child的Getter中使用
base.parentVirtualInt
而不是
base.VirtualProperty
时,我会得到相同的行为。我还不明白为什么这不起作用。有人能解释一下吗?我觉得被重写的属性的行为与被重写的方法不同

顺便说一下:我正在做一些非常类似的事情,对一个我无法控制的类进行子类化(这就是为什么我的“变通方法”不是一个选项的主要原因)

这(可以说)是调试器中的一个bug。你可以把你的票加到这上面。这不容易修复,我确信,调试器没有对基属性getter方法地址的现成访问权限,因为属性getter的v-table槽已在派生类中被替换

一种可能的解决方法是首先将基值存储在局部变量中,以便可以检查该局部变量。这不会让你的getter速度变慢