Por que o compilador emite instruções da caixa para comparar instâncias de um tipo de referência?

Aqui está um tipo genérico simples com um parâmetro genérico exclusivo restrito aos tipos de referência:

class A<T> where T : class
{
    public bool F(T r1, T r2)
    {
        return r1 == r2;
    }
}

O geradoIL por csc.exe é:

ldarg.1
box        !T
ldarg.2
box        !T
ceq

Portanto, cada parâmetro éencaixotado antes de prosseguir com a comparação.

Mas se a restrição indicar que "T" nunca deve ser um tipo de valor,por que o compilador está tentando encaixotarr1 er2 ?

questionAnswers(2)

yourAnswerToTheQuestion