Исследуя ошибку, я обнаружил, что это связано с этой странностью в С#:
sbyte[] foo = new sbyte[10];
object bar = foo;
Console.WriteLine("{0} {1} {2} {3}",
foo is sbyte[], foo is byte[], bar is sbyte[], bar is byte[]);
Вывод "True False True True", в то время как я ожидал бы "bar is byte[]" для возврата False. Очевидно, что бар является a byte[] и a sbyte[]? То же самое происходит и для других типов подписанных/неподписанных типов, таких как Int32[] vs UInt32[], но не для слова Int32[] vs Int64[].
Может ли кто-нибудь объяснить это поведение? Это в .NET 3.5.