В декомпиляторе есть ошибка. Эта строка
if ((insertCommand == null) != null)
должен был быть декомпилирован до
if ((insertCommand == null) != false)
который, хотя и неоправданно многословен, по крайней мере является правильным кодом.
Декомпилятор, вероятно, делает эту излишне подробную версию, потому что компилятор C # часто выбирает
if (x)
Y();
Z();
как если бы вы написали
if (!x)
goto L;
Y();
L: Z();
Поскольку код, сгенерированный для обеих программ, одинаков, декомпилятор не всегда знает, какой код является наиболее разумным для отображения.
Причина неожиданного "! = False" заключается в том, что когда мы генерируем IL, который проверяет, является ли что-то истинным, самый быстрый и самый компактный код, который мы можем сгенерировать, это проверять, не является ли оно ложным. False представляется как ноль в IL, и есть дешевая инструкция для «это ноль?»