Looking at this C# code:
byte x = 1; byte y = 2; byte z = x + y; // ERROR: Cannot implicitly convert type \'int\' to \'byte\'
The result of
My suspicion is that C# is actually calling the operator+ defined on int (which returns an int unless you are in a checked block), and implicitly casting both of your bytes/shorts to ints. That's why the behavior appears inconsistent.
operator+
int
checked
bytes
shorts
ints