CSharp - Interfaces and Boxing

Introduction

Converting a struct to an interface causes boxing.

Calling an implicitly implemented member on a struct does not cause boxing:

interface  Printable {
   void Test();
}
struct PDFDocument : Printable {
   public void Test() {}
}

PDFDocument s = new PDFDocument();
s.Test();            // No boxing.
Printable i = s;     // Box occurs when casting to interface.
i.Test();