我不确定这是否是.NET的bug,但我觉得它非常有趣。
如预期的那样,我无法做到这一点:
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[]
,但调试器失去了焦点,在数组中显示?
。
备注3: 这仅适用于数组本身,而不适用于底层类型本身:
object sbyteObj = (sbyte)1;
byte byteObj = (byte)sbyteObj; // System.InvalidCastException: Specified cast is not valid.
好的,我当然可以这样检查类型:
if (obj.GetType() == typeof(byte[]))
这是 as
操作符和直接类型转换的预期行为,还是一个 .NET 的 bug?