Это не будет коробка (удивил меня).Я думаю, что объяснение bnkdev покрывает это.Вот как я это доказал:
Написал приложение для быстрой консоли ниже (обратите внимание, я включил BoxTest (), который я знаю, что будет боксировать, так что мне было с чем сравнивать).
Затем я использовал Reflector для дизассемблирования скомпилированного вывода в IL (вы можете использовать ILDASM).
namespace StructInterfaceBoxingTest
{
public struct TestStruct : IDisposable
{
#region IDisposable Members
public void Dispose()
{
System.Console.WriteLine("Boo!");
}
#endregion
}
class Program
{
static void Main(string[] args)
{
using (TestStruct str = new TestStruct())
{
}
}
static void BoxTest()
{
TestStruct str = new TestStruct();
ThisWillBox(str);
}
static void ThisWillBox(object item) {}
}
}
Хорошо, так что сначала, вот IL для BoxTest - обратите внимание на инструкцию box наСтрока L_000a (звездочка выделений)
.method private hidebysig static void BoxTest() cil managed
{
.maxstack 1
.locals init (
[0] valuetype StructInterfaceBoxingTest.TestStruct str)
L_0000: nop
L_0001: ldloca.s str
L_0003: initobj StructInterfaceBoxingTest.TestStruct
L_0009: ldloc.0
L_000a: **box** StructInterfaceBoxingTest.TestStruct
L_000f: call void StructInterfaceBoxingTest.Program::ThisWillBox(object)
L_0014: nop
L_0015: ret
}
Теперь взглянем на Main (где мы используем оператор using с нашей структурой IDisposable):
.method private hidebysig static void Main(string[] args) cil managed
{
.entrypoint
.maxstack 1
.locals init (
[0] valuetype StructInterfaceBoxingTest.TestStruct str)
L_0000: nop
L_0001: ldloca.s str
L_0003: initobj StructInterfaceBoxingTest.TestStruct
L_0009: nop
L_000a: nop
L_000b: leave.s L_001c
L_000d: ldloca.s str
L_000f: constrained StructInterfaceBoxingTest.TestStruct
L_0015: callvirt instance void [mscorlib]System.IDisposable::Dispose()
L_001a: nop
L_001b: endfinally
L_001c: nop
L_001d: ret
.try L_0009 to L_000d finally handler L_000d to L_001c
}
Обратите внимание на ключевое слово с ограничениями в строкеL_000f.Я не могу найти ссылку именно для того, что означает это ключевое слово, но я, если вы читаете пост bnkdev, думаю, что это ограниченный виртуальный вызов, который описывает.