Рассмотрим следующий код:
void f(byte x) {print("byte");}
void f(short x) {print("short");}
void f(int x) {print("int");}
void main() {
byte b1, b2;
short s1, s2;
f(b1 + b2); // byte + byte = int
f(s1 + s2); // short + short = int
}
В C ++, C #, D и Java оба вызова функций разрешают перегрузки "int" ... Я уже понимаю, это "в спецификациях", но почему языки разработаны таким образом ? Я ищу более глубокую причину.
Для меня имеет смысл, чтобы результат был наименьшим типом, способным представлять все возможные значения обоих операндов , например:
byte + byte --> byte
sbyte + sbyte --> sbyte
byte + sbyte --> short
short + short --> short
ushort + ushort --> ushort
short + ushort --> int
// etc...
Это устранит неудобный код, такой как short s3 = (short)(s1 + s2)
, а также сделает IMO более интуитивно понятным и более простым для понимания.
Это наследие со времен C или есть более веские причины для нынешнего поведения?