Компилятор заменяет явное приведение к моему собственному типу явным приведением к типу .NET?

У меня есть следующий код:

public struct Num
{
    private readonly T _Value;

    public Num(T value)
    {
        _Value = value;
    }

    static public explicit operator Num(T value)
    {
        return new Num(value);
    }
}

...
double d = 2.5;
Num b = (Num)d;

Этот код компилируется, и это удивляет меня. Явное преобразование должно принимать толькоbyteнеdouble, Но дубль принят как-то. Когда я размещаю точку останова внутри конверта, я вижу, чтоvalue ужеbyte со значением2, При приведении от двойного к байту должно быть явным.

Если я декомпилирую свой EXE с помощью ILSpy, я вижу следующий код:

double d = 2.5;
Program.Num b = (byte)d;

Мой вопрос: где этот дополнительный бросокbyte приходящий из? Почему это дополнительное место для актеров? Где мой актерский составNum идти к?

РЕДАКТИРОВАТЬ

СтруктураNum это вся структура, так что больше нет скрытых дополнительных методов или операторов.

РЕДАКТИРОВАТЬ

IL в соответствии с просьбой:

IL_0000: nop
IL_0001: ldc.r8 2.5 // Load the double 2.5.
IL_000a: stloc.0
IL_000b: ldloc.0
IL_000c: conv.u1 // Once again the explicit cast to byte.
IL_000d: call valuetype GeneriCalculator.Program/Num`1 valuetype GeneriCalculator.Program/Num`1::op_Explicit(!0) 
IL_0012: stloc.1
IL_0013: ret

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

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