Например:
.method private hidebysig instance void Insert(!TKey key, !TValue 'value', bool add) cil managed
{
.maxstack 3
.locals init (
[0] int32 num,
[1] int32 num2,
[2] int32 num3,
[3] int32 num4)
L_0000: ldarg.1
L_0001: box !TKey
L_0006: brtrue.s L_000e
L_0008: ldc.i4.5
L_0009: call void System.ThrowHelper::ThrowArgumentNullException(valuetype System.ExceptionArgument)
Это из внутреннего метода Add Dictionary‹int,Object› в .NET 4.0. Хотя дженерики широко рекламируются как помогающие избежать упаковки типов значений, почему этот системный компонент выполняет эту неэффективную проверку каждой операции для ключа типа значения? Если я правильно понимаю, это не только снижает производительность, но и всегда возвращает true (тип значения в штучной упаковке никогда не будет нулевой ссылкой)
редактировать: Резюме ответа Марка на этот конкретный вопрос: причина, по которой это важно, заключается в том, что эта реализация Dictionary‹K,V› решила запретить использование «нулевых» экземпляров Nullable‹T› в качестве ключей. Поскольку инструкция поля MSIL специально обрабатывает тип значения Nullable‹T›, проверка не обязательно бесполезна для всех типов значений.