我正在调试以下代码:
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"
:
问题是:为什么不"A"
?
答案 0 :(得分:-1)
答案 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";
}
}