Consider the following code:
UInt32 val = 1; UInt32 shift31 = val << 31; // shift31 == 0x80000000 UInt32 shift32 = val << 32;
Unit32 overflows at 32 bits, that is defined in the spec. What are you expecting?
The CLR does not define a left shift with overflow detection operator(1). If you need that kind of facility you need to check for yourself.
(1) The C# compiler might cast it to long, but I am not sure.