Я поигрался с реализацией своего компьютера с внутренним кодом (с момента появления кода 2019) и обнаружил, что когда я реализовал переключатель (чтобы выбрать, какую операцию выполнять), он принимал неправильное значение.
Следующее Код демонстрирует это. InstructionPointer
имел значение 2
, opcode
имел значение 6
, что означает, что будет использоваться OpcodeJumpIfFalse
. Функция Jif()
вызывается просто отлично, и она возвращает значение, в моем случае она возвращала 0
. Jif()
также изменил значение InstructionPointer
, изменив его значение на 9
. InstructionPointer
будет увеличено на 0
(возвращаемое значение Jif()
), и я ожидаю, что его значение будет 9
, но его значение go вернется к 2
.
InstructionPointer += opcode switch
{
OpcodeAdd => Add(),
OpcodeMultiply => Mul(),
OpcodeInput => Inp(),
OpcodeOutput => Out(),
OpcodeJumpIfTrue => Jit(),
OpcodeJumpIfFalse => Jif(),
OpcodeLessThan => Let(),
OpcodeEquals => Equ(),
OpcodeAdjustRelativeBase => Arb(),
OpcodeHalt => End(),
_ => throw new ArgumentOutOfRangeException()
};
Минимальный пример, показывающий то же поведение:
int j = 2;
int i = 1;
int A()
{
j = 10;
return 0;
}
j += i switch
{
1 => A(),
_ => throw new Exception()
};
Console.WriteLine(j);
Я заметил, что Resharper (в минимальном примере) говорит мне, что назначение не используется в A()
.
Мой вопрос: почему это происходит? Значение j
"захвачено" перед переключателем? Это ожидаемое поведение?
На данный момент я изменил свой код, чтобы использовать временную переменную, которая решает проблему, но я все еще хотел бы знать, что здесь происходит.