Что делает вызов Min (byte, int) неоднозначным? - PullRequest
4 голосов
/ 07 февраля 2011

Я не понимаю, почему следующее неоднозначно в соответствии с компилятором:

byte x = 200; 
int novaCervena = Math.Min(x, 10);

И как только я добавляю +1 к байту, это не

byte x = 200; 
int novaCervena = Math.Min(x+1, 10);

Ответы [ 2 ]

11 голосов
/ 07 февраля 2011

Это определенно не является двусмысленным, когда вы используете 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)
4 голосов
/ 07 февраля 2011

Я предполагаю, что в первом случае он не может выбирать между Min(byte,byte) и Min(int,int).

Операции на byte всегда приводят к int, поэтому x+1 равно int, и нет никакой двусмысленности - нужно выбрать Min(int,int).

...