Short - это 2-байтовый тип, а байт, ну, в общем, один байт. Когда вы преобразуете два байта в один, вы заставляете систему привести все в порядок, и один из исходных байтов (самый значимый) удаляется и данные теряются. То, что осталось от значения 23948 (двоичный код: 0101 1101 1000 1100) равно 140, что в двоичном виде переводится в 1000 1100. Итак, вы переходите от:
0101 1101 1000 1100 (2 byte decimal value 23948)
до:
1000 1100 (1 byte decimal value 140)
Вы можете сделать это только с явным приведением. Если вы попытаетесь присвоить байту короткое замыкание без приведения, компилятор выдаст ошибку из-за вероятности потери данных:
Невозможно неявно преобразовать тип 'short' в 'byte'. Явный
конверсия существует (вам не хватает актеров?)
С другой стороны, если вы приведете от байта к короткому, вы можете сделать это неявно, поскольку никакие данные не будут потеряны.
using System;
public class MyClass
{
public static void Main()
{
short myShort = 23948;
byte myByte = (byte)myShort; // ok
myByte = myShort; // error:
Console.WriteLine("Short: " + myShort);
Console.WriteLine("Byte: " + myByte);
myShort = myByte; // ok
Console.WriteLine("Short: " + myShort);
}
}
С арифметическим переполнением и непроверенным контекстом:
using System;
public class MyClass {
public static void Main() {
unchecked {
short myShort = 23948;
byte myByte = (byte)myShort; // ok
myByte = myShort; // still an error
int x = 2147483647 * 2; // ok since unchecked
}
}
}