The problem is the intermediate values in the second part of the crc calculation:
crc = (ushort) (crc_table[ i & 0x0F ] ^ ( crc << 4 ));
the value of crc << 4 in this line is greater than 0xFFFF so the cast to ushort fails.
Add some additional masking to 16 bits to ensure this behaves correctly.
OR
wrap the interior of the for loop in the
unchecked
construct.
Aside: This symptom only appears if arithmetic overflow/underflow checking is enabled, which, by default, it is not.