c# - ver - la depuración de scripts de chrome en visual studio está habilitada
Valor de la propiedad de "base" en el depurador (3)
Estoy depurando el siguiente código:
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);
}
Y tengo un punto de interrupción en la línea marcada con (o)
. Cuando llega el punto de interrupción, estoy tratando de evaluar base.X
y obteniendo su valor "B"
:
La pregunta es: ¿por qué no "A"
?
Este es un error de Roslyn
Como otros han mencionado, este error es github.com/dotnet/roslyn/issues/3723 .
Puede comprobar de forma trivial que el valor real de base.X
es A , es solo el Evaluador de expresiones el que devuelve el resultado incorrecto:
¿Quizás debería leer un poco más sobre esto ?: Operador https://docs.microsoft.com/en-us/dotnet/articles/csharp/language-reference/operators/conditional-operator
Dado que el valor predeterminado OwnX es verdadero.
Dale una oportunidad a este código:
B b = new B();
b.OwnX = false;
Console.WriteLine(b.X);
Explicando este código: cadena de anulación pública X => OwnX? "B": base.X;
Para hacerlo más legible:
public override string X
{
get {
if (Ownx == true) // this is the default value.
{
return "B";
}
else{
return "A";
}
}
Debido a que X no se evalúa en tiempo de ejecución, tampoco se evaluará en el depurador. Entonces asume que es lo mismo.
Debido a que en realidad no se llama a base.X, nunca se ha evaluado como A. La propiedad de sobrescritura se debe a ese encabezado.
Si quieres hacerlo, haz una constante de ello.