Я не уверен, является ли это ошибкой .NET, но я нахожу это действительно интересным.
Как и ожидалось, я не могу этого сделать:
sbyte[] sbytes = { 1, 2, 3 };
byte[] bytes = sbytes; // fails: cannot convert source type 'sbyte[]' to taget type 'byte[]'
Однако, если тип sbytes
равен object
, это работает:
object obj = new sbyte[]{ 1, 2, 3 };
byte[] bytes = obj as byte[];
Assert.IsNull(bytes, "WTF??")
Замечание 1: та же проблема возникает для int[]
- uint[]
и других примитивных типов.
Замечание 2. Хотя код обрабатывает массив как byte[]
, отладчик теряет фокус и показывает ?
-s в массиве.
Примечание 3. Это работает только для массивов, а не для самих базовых типов:
object sbyteObj = (sbyte)1;
byte byteObj = (byte)sbyteObj; // System.InvalidCastException: Specified cast is not valid.
Хорошо, конечно, я могу проверить тип следующим образом:
if (obj.GetType() == typeof(byte[]))
Является ли это предполагаемым поведением оператора as
и прямого каста, или это ошибка .NET?