Я знаю, почему это запрещено:
ulong x = 0xFEDCBA9876543210;
long y = Int64.MaxValue;
Console.WriteLine(x < y);
Очевидно, что среда выполнения не может неявно привести операнд к другому типу или к большему типу, чтобы сравнение работало.
Operator '<' cannot be applied to operands of type 'ulong' and 'long'.
Так вот, это тоже не разрешено (с MinValue
иconst
):
ulong x = 0xFEDCBA9876543210;
const long y = Int64.MinValue;
Console.WriteLine(x < y);
Тем не менее, это разрешено (с MaxValue
вместо):
ulong x = 0xFEDCBA9876543210;
const long y = Int64.MaxValue;
Console.WriteLine(x < y);
Нет перегрузки <
, принимающей ulong
и long
, но я видел с помощью Reflector, что это автоматически преобразует Int64.MaxValue
в ulong
. Но это происходит не всегда. Как это работает, и какие соображения являются причиной этого несоответствия?