Согласовано. 2-й вызов MyDouble :: op_Implicit просто неверен. Спасибо за выявление проблемы с подключением; Вы правы, похоже, что это так. Я повторюсь, чтобы увидеть, смогу ли я получить некоторую тягу к нему, и, поскольку это является проблемой при создании кода отмены, возможно, даже некоторый промах относительно того, будет ли аксессор поднятого элемента в C # 5!

вая следующее, почему InvalidCastException выбрасывается? Я не понимаю, почему это должно быть за пределами ошибки (это в x86; x64 вылетает с 0xC0000005 в clrjit.dll).

class Program
{
    static void Main(string[] args)
    {
        MyDouble? my = new MyDouble(1.0);
        Boolean compare = my == 0.0;
    }

    struct MyDouble
    {
        Double? _value;

        public MyDouble(Double value)
        {
            _value = value;
        }

        public static implicit operator Double(MyDouble value)
        {
            if (value._value.HasValue)
            {
                return value._value.Value;
            }

            throw new InvalidCastException("MyDouble value cannot convert to System.Double: no value present.");
        }
    }
}

Вот CIL, сгенерированный дляMain():

.method private hidebysig static void Main(string[] args) cil managed
{
    .entrypoint
    .maxstack 3
    .locals init (
        [0] valuetype [mscorlib]System.Nullable`1<valuetype Program/MyDouble> my,
        [1] bool compare,
        [2] valuetype [mscorlib]System.Nullable`1<valuetype Program/MyDouble> CSвая следующее, почему InvalidCastException выбрасывается? Я не понимаю, почему это должно быть за пределами ошибки (это в x86; x64 вылетает с 0xC0000005 в clrjit.dll).0000,
        [3] valuetype [mscorlib]System.Nullable`1<float64> CSвая следующее, почему InvalidCastException выбрасывается? Я не понимаю, почему это должно быть за пределами ошибки (это в x86; x64 вылетает с 0xC0000005 в clrjit.dll).0001)
    L_0000: nop 
    L_0001: ldloca.s my
    L_0003: ldc.r8 1
    L_000c: newobj instance void Program/MyDouble::.ctor(float64)
    L_0011: call instance void [mscorlib]System.Nullable`1<valuetype Program/MyDouble>::.ctor(!0)
    L_0016: nop 
    L_0017: ldloc.0 
    L_0018: stloc.2 
    L_0019: ldloca.s CSвая следующее, почему InvalidCastException выбрасывается? Я не понимаю, почему это должно быть за пределами ошибки (это в x86; x64 вылетает с 0xC0000005 в clrjit.dll).0000
    L_001b: call instance bool [mscorlib]System.Nullable`1<valuetype Program/MyDouble>::get_HasValue()
    L_0020: brtrue.s L_002d
    L_0022: ldloca.s CSвая следующее, почему InvalidCastException выбрасывается? Я не понимаю, почему это должно быть за пределами ошибки (это в x86; x64 вылетает с 0xC0000005 в clrjit.dll).0001
    L_0024: initobj [mscorlib]System.Nullable`1<float64>
    L_002a: ldloc.3 
    L_002b: br.s L_003e
    L_002d: ldloca.s CSвая следующее, почему InvalidCastException выбрасывается? Я не понимаю, почему это должно быть за пределами ошибки (это в x86; x64 вылетает с 0xC0000005 в clrjit.dll).0000
    L_002f: call instance !0 [mscorlib]System.Nullable`1<valuetype Program/MyDouble>::GetValueOrDefault()
    L_0034: call float64 Program/MyDouble::op_Implicit(valuetype Program/MyDouble)
    L_0039: newobj instance void [mscorlib]System.Nullable`1<float64>::.ctor(!0)
    L_003e: stloc.3 
    L_003f: ldloca.s CSвая следующее, почему InvalidCastException выбрасывается? Я не понимаю, почему это должно быть за пределами ошибки (это в x86; x64 вылетает с 0xC0000005 в clrjit.dll).0001
    L_0041: call instance !0 [mscorlib]System.Nullable`1<float64>::GetValueOrDefault()
    L_0046: call float64 Program/MyDouble::op_Implicit(valuetype Program/MyDouble)
    L_004b: conv.r8 
    L_004c: ldc.r8 0
    L_0055: bne.un.s L_0060
    L_0057: ldloca.s CSвая следующее, почему InvalidCastException выбрасывается? Я не понимаю, почему это должно быть за пределами ошибки (это в x86; x64 вылетает с 0xC0000005 в clrjit.dll).0001
    L_0059: call instance bool [mscorlib]System.Nullable`1<float64>::get_HasValue()
    L_005e: br.s L_0061
    L_0060: ldc.i4.0 
    L_0061: stloc.1 
    L_0062: ret 
}

Обратите внимание на строки 0x2D - 0x3E в IL. ПолучаетMyDouble? экземпляр, звонкиGetValueOrDefault на нем, вызывает неявный оператор для этого, а затем оборачивает результат вDouble? и сохраняет его в сгенерированном компиляторомCSвая следующее, почему InvalidCastException выбрасывается? Я не понимаю, почему это должно быть за пределами ошибки (это в x86; x64 вылетает с 0xC0000005 в clrjit.dll).0001 местный. В строках от 0x3F до 0x55 мы получаемCSвая следующее, почему InvalidCastException выбрасывается? Я не понимаю, почему это должно быть за пределами ошибки (это в x86; x64 вылетает с 0xC0000005 в clrjit.dll).0001 значение, развернуть черезGetValueOrDefault а затем сравнить с 0 ...НО ЖДУ МИНУТУ! Что это за дополнительный вызовMyDouble::op_Implicit делать по линии 0х46?

Если мы отладим программу на C #, мы действительно увидим 2 вызоваimplicit operator Double(MyDouble value), и это второй вызов, который не удается, так какvalue не инициализируется.

Что здесь происходит?

Ответы на вопрос(2)

Ваш ответ на вопрос