Документация сопоставления константных шаблонов с состояниями is
-operator (expr is constant
):
Постоянное выражение оценивается следующим образом:
Если
expr
иconstant
являются целочисленными типами, оператор равенства С# определяет, возвращает ли выражение значениеtrue
(то есть является лиexpr == constant
).В противном случае значение выражения определяется путем вызова статического метода
Object.Equals(expr, constant)
.
Поэтому при использовании этого кода
public bool IsZero(int value)
{
return value is 0;
}
Я ожидаю, что он будет использовать оператор ==
(случай 1) и сгенерировать этот код:
.method public hidebysig instance bool
IsZero(
int32 'value'
) cil managed
{
.maxstack 8
ldarg.1
ldc.i4.0
ceq
ret
}
Однако в действительности целочисленный параметр и константа (литерал) заключены в Object.Equals
для передачи в статический метод Object.Equals
(случай 2):
.method public hidebysig instance bool
IsZero(
int32 'value'
) cil managed
{
.maxstack 8
ldc.i4.0
box [mscorlib]System.Int32
ldarg.1
box [mscorlib]System.Int32
call bool [mscorlib]System.Object::Equals(object, object)
ret
}
Почему это так?