Тип выражения s + 1
равен Int32
- оба операнда преобразуются в Int32
перед выполнением сложения. Таким образом, ваш код эквивалентен:
public void Overflow()
{
Int16 s = 32767;
s = (Int16) ((Int32) s + (Int32) 1);
}
Таким образом, переполнение фактически происходит только при явном приведении.
Или, иначе говоря, потому что так сказано в спецификации языка. Вы должны описать одно из:
- Почему вы считаете, что компилятор нарушает спецификацию языка
- Точное изменение, которое вы предлагаете в спецификации языка
РЕДАКТИРОВАТЬ: просто чтобы прояснить ситуацию (на основе ваших комментариев), компилятор не допустит этого:
s = s + 1;
когда s
является Int16
независимо от того, может быть известно значение s
. Там нет оператора Int16 operator+ (Int16, Int16)
- как показано в разделе 7.8.4 спецификации C # 4, операторы сложения целых чисел:
int operator +(int x, int y);
uint operator +(uint x, uint y);
long operator +(long x, long y);
ulong operator +(ulong x, ulong y);