Это определенно не является двусмысленным, когда вы используете x+1
, поскольку тип первого аргумента равен int
. (Там нет оператора byte+byte
в C #.)
В первом случае у вас есть аргумент byte
, который можно неявно преобразовать в int
, но затем целочисленный литеральный аргумент. Аргумент имеет тип int
, но с неявным преобразованием константного выражения в byte
(см. Раздел 6.1.9). Таким образом, хотя и Min(byte, byte)
, и Min(int, int)
являются применимыми перегрузками, каждая из них "предпочтительна" для другого параметра (из-за доступных преобразований), поэтому возникает неоднозначность.
Обратите внимание, что если у вас есть "нормальное" выражение типа int
(в отличие от константного выражения), неопределенность исчезнет:
byte x = 200;
int y = 10;
int z = Math.Min(x, y); // Uses Math.Min(int, int)
Аналогично обычному byte
аргументу:
byte x = 200;
byte y = 10;
byte z = Math.Min(x, y); // Uses Math.Min(byte, byte)
Или вы можете вызвать преобразование в любом случае:
byte x = 200;
byte z = Math.Min(x, (byte)10); // Uses Math.Min(byte, byte)
byte a = 200;
int b = Math.Min((int) a, 10); // Uses Math.Min(int, int)