Это не ошибка, так как существует преобразование (int?
); он генерирует предупреждение в приведенном примере:
Результат выражения всегда «false», поскольку значение типа «int» никогда не равно «null» типа 'int? '
blockquote>Если вы проверите IL, вы увидите, что он полностью удаляет недостижимую ветку - она не существует в сборке релизов.
Обратите внимание, что он не генерирует это предупреждение для пользовательских структур с операторами равенства. Он использовался в версии 2.0, но не в компиляторе 3.0. Код по-прежнему удаляется (поэтому он знает, что код недостижим), но не генерируется предупреждение:
using System; struct MyValue { private readonly int value; public MyValue(int value) { this.value = value; } public static bool operator ==(MyValue x, MyValue y) { return x.value == y.value; } public static bool operator !=(MyValue x, MyValue y) { return x.value != y.value; } } class Program { static void Main() { int i = 1; MyValue v = new MyValue(1); if (i == null) { Console.WriteLine("a"); } // warning if (v == null) { Console.WriteLine("a"); } // no warning } }
С IL (для
Main
) - отметьте все, кромеMyValue(1)
( который может иметь побочные эффекты):.method private hidebysig static void Main() cil managed { .entrypoint .maxstack 2 .locals init ( [0] int32 i, [1] valuetype MyValue v) L_0000: ldc.i4.1 L_0001: stloc.0 L_0002: ldloca.s v L_0004: ldc.i4.1 L_0005: call instance void MyValue::.ctor(int32) L_000a: ret }
это в основном:
private static void Main() { MyValue v = new MyValue(1); }