次のコードを検討してください。
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の時代からの残された遺産ですか、それとも現在の動作のより良い理由がありますか?