Невозможное сравнение между улонгом и лонгом вдруг стало возможным

Я знаю, почему это запрещено:

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. Но это происходит не всегда. Как это работает, и какие соображения являются причиной этого несоответствия?

6
задан Daniel A.A. Pelsmaeker 3 May 2014 в 16:18
поделиться