Section I.12.3.2.1 of ISO/IEC 23271:2012 (CLI Specification) states the following:
While the CLI, in general, supports the full set of types described in §I.12.1, the CLI treats the evaluation stack in a special way. While some JIT compilers might track the types on the stack in more detail, the CLI only requires that values be one of:
int64
, an 8-byte signed integerint32
, a 4-byte signed integernative int
, a signed integer of either 4 or 8 bytes, whichever is more convenient for the target architectureF
, a floating point value (float32, float64, or other representation supported by the underlying hardware)&
, a managed pointerO
, an object reference*
, a “transient pointer,” which can be used only within the body of a single method, that points to a value known to be in unmanaged memory (see the CIL Instruction Set specification for more details. * types are generated internally within the CLI; they are not created by the user).- A user-defined value type
So, yes, the evaluation stack can contain a value type. And that value type is copied.