Почему в Ruby `a = a`` nil`?

Это не ошибка, так как существует преобразование (int?); он генерирует предупреждение в приведенном примере:

Результат выражения всегда «false», поскольку значение типа «int» никогда не равно «null» типа 'int? '

Если вы проверите 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);
}
37
задан Boris Stitnicky 3 October 2012 в 10:25
поделиться