В основном вы ответили на свой вопрос.Когда ваш код скомпилирован, он трансформируется в промежуточный язык (IL).В IL нет имен переменных, как в вашем коде, аргументы вызываемого метода помещаются в стек перед вызовом метода, а аргументы методов current и локальные переменные ссылаются на их позицию.Я считаю, что это потому, что эта структура помогает компилятору JIT генерировать код.
Файл символов pdb хранит отображение между сгенерированным IL и вашим кодом.Он используется, чтобы сказать вам, к какой строке в вашем коде относится каждый вызов метода в стеке вызовов.Возможно, информация, хранящаяся здесь, недостаточно детальна, чтобы сказать, какая переменная равна нулю, или, возможно, она считалась слишком дорогой с точки зрения срока действия, чтобы сделать это.В любом случае, если вы позволили компилятору оптимизировать сгенерированный IL, может больше не быть однозначного соответствия между переменными в IL и переменными в вашем коде.
Надеюсь, это поможет, Роб