То, что происходит, это именно то, что говорит.
В первом случае у вас есть короткий, без коробки, который вы затем явно вводите в тип int. Это допустимое преобразование, которое компилятор знает, как это сделать, поэтому оно работает.
Во втором случае у вас есть int, в штучной упаковке, которые присваивают обратно int. Это простая распаковка целого числа, которая также действительна, поэтому она работает.
В третьем случае у вас есть короткое, в штучной упаковке, которое вы пытаетесь распаковать в переменную, которая не является коротким. Это недопустимая операция: вы не можете сделать это за один шаг. Это также не редкая проблема: если вы используете, например, SqlDataReader
, который содержит столбец SMALLINT
, вы не можете сделать:
int x = (int)rdr["SmallIntColumn"];
В вашем третьем примере должно работать одно из следующих:
object thirdTest = Convert.ToInt16(0);
int thirdTest2 = Convert.ToInt32(thirdTest);
int thirdTest3 = (int)(short)thirdTest;