title: Useless boxing with generic types
body: <p>The <code>TestMethod</code> of this sample code</p>
  <pre><code>public class Test&lt;T&gt; where T : class
  {
      public void TestMethod(T param)
      {
          PrivateMethod(param);
      }
  
      private void PrivateMethod(object obj)
      {
  
      }
  }
  </code></pre>
  <p>compiles into this IL code:</p>
  <pre><code>IL_0000:  ldarg.0
  IL_0001:  ldarg.1
  IL_0002:  box        !T
  IL_0007:  call       instance void class SensorPositioner2.Test`1&lt;!T&gt;::PrivateMethod(object)
  IL_000c:  ret
  </code></pre>
  <p>As I see the <code>box</code> instruction, would a new object be created during the <code>TestMethod</code> call?</p>
  <p>If so, how can I avoid this? If not, why <code>box</code> is needed here?</p>