1. В теории реализация не обязана использовать стек для хранения локальных объектов value-типов (см.
https://blogs.msdn.microsoft.com/ericlippert/2009/... ).
2. Тем не менее, в текущих реализациях используется именно стек, поэтому всё как и в остальных языках:
https://ru.wikipedia.org/wiki/%D0%A1%D1%82%D0%B5%D... .
3. Помните, что значения value-типов
иногда (не всегда) хранятся на стеке. Все значения value-типов, являющиеся частью объекта ссылочного типа (например, int-поле в классе или элементы массива double) рождаются и умирают вместе с этим объектом.
Итого:
- время жизни локальных объектов value-типов связывается с фреймом стека;
- время жизни объектов value-типов, находящихся в составе объектов reference-типов, связывается с временем жизни объемлющего объекта;
Более экзотические ситуации рассматривать не будем. И вообще, как говорит Липперт (см. ссылку), лучше не думать в терминах стека, т.к. это деталь реализации. Лучше говорить о времени жизни относительно вызываемых функций и относительно других объектов.