Компилятор одинаков во всех случаях - Roslyn.Разные версии производят разные IL, хотя.Версии C # 8 не коробятся, в то время как старые делают.
Например, с 2.9.0 IL для этого фрагмента:
using System;
public class C {
public bool IsZero(int value)
{
return value is 0;
}
}
равно
IL_0000: nop
IL_0001: ldc.i4.0
IL_0002: box [mscorlib]System.Int32
IL_0007: ldarg.1
IL_0008: box [mscorlib]System.Int32
IL_000d: call bool [mscorlib]System.Object::Equals(object, object)
IL_0012: stloc.0
IL_0013: br.s IL_0015
IL_0015: ldloc.0
IL_0016: ret
Использование любого из C # 8 версии , хотя производит это в режиме отладки:
IL_0000: nop
IL_0001: ldarg.1
IL_0002: ldc.i4.0
IL_0003: ceq
IL_0005: stloc.0
IL_0006: br.s IL_0008
IL_0008: ldloc.0
IL_0009: ret
и это в Release .
IL_0000: ldarg.1
IL_0001: ldc.i4.0
IL_0002: ceq
IL_0004: ret
Это то же самое, что и ожидаемый код в вопросе