За некоторыми исключениями, разрешение типа в C# не заботится о типе, который вы назначаете для . Все, что компилятор рассматривает в вашем случае, это
i2 + i3 + i4 + i5
Поскольку каждый из операндов имеет тип int
, результат будет также типа int
(или, точнее, , он использует оператор сложения, который принимает два int
s в качестве аргументов и возвращает int
), хотя впоследствии вы присваиваете его long
local.
Путем приведения одного из операндов к long
, оператор int, int -> int
больше не подходит, и выбран long, long -> long
. Например, то же самое относится и к float
- как только один из операндов равен float
, результат равен float
- в противном случае a / b
дает целочисленное деление (оператор int, int -> int
).
В общем, вам нужно убедиться, что тип данных, с которыми вы работаете, достаточно большой, чтобы в нем содержались и любые промежуточные значения. Если вы ожидаете результат, который не вписывается в int
, не используйте int
. По умолчанию C# не проверяет переполнение - вы можете переопределить его следующим образом:
var result = checked(i2 + i3 + i4 + i5);
Таким образом, вместо тихого перехода к неправильному значению int
, вы получите исключение.