Per Eric Lippert:
A call to IDisposable.Dispose on a struct is generated as a constrained virtual call, which most of the time does NOT box the value.
A constrained virtual call on a value type only boxes the value if the virtual method is NOT implemented by the type. The only circumstances under which a virtual method can be unimplemented by the value type is when the method is, say, ToString, and implemented by the base class, System.ValueType.
See section 2.1 of Partition III of the CLI documentation for more detail.
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…