У меня есть следующий код:
public struct Num<T>
{
private readonly T _Value;
public Num(T value)
{
_Value = value;
}
static public explicit operator Num<T>(T value)
{
return new Num<T>(value);
}
}
...
double d = 2.5;
Num<byte> b = (Num<byte>)d;
Этот код компилируется, и это меня удивляет. Явный конвертер должен принимать только byte
, а не double
. Но двойник как-то принят. Когда я помещаю точку останова внутри конверта, я вижу, что value
уже есть byte
со значением 2
. Путем кастинга от double to byte должно быть явно.
Если я декомпилирую свой EXE с помощью ILSpy, я вижу следующий код:
double d = 2.5;
Program.Num<byte> b = (byte)d;
Мой вопрос: откуда этот дополнительный прилив от byte
? Почему это дополнительное место? Куда отправил мой тэг Num<byte>
?
ИЗМЕНИТЬ
Структура Num<T>
- это целая структура, поэтому больше нет скрытых дополнительных методов или операторов.
ИЗМЕНИТЬ
ИЛ, по просьбе:
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<!0> valuetype GeneriCalculator.Program/Num`1<uint8>::op_Explicit(!0)
IL_0012: stloc.1
IL_0013: ret