Рассмотрим этот надуманный, тривиальный пример:
var foo = new byte[] {246, 127};
var bar = foo.Cast<sbyte>();
var baz = new List<sbyte>();
foreach (var sb in bar)
{
baz.Add(sb);
}
foreach (var sb in baz)
{
Console.WriteLine(sb);
}
С магией Two Complement, -10 и 127 печатается на консоли. Все идет нормально. Люди с острыми глазами увидят, что я повторяю перечислимое количество и добавляю его в список. Это звучит как ToList
:
var foo = new byte[] {246, 127};
var bar = foo.Cast<sbyte>();
var baz = bar.ToList();
//Nothing to see here
foreach (var sb in baz)
{
Console.WriteLine(sb);
}
За исключением того, что это не работает. Я получаю это исключение:
Тип исключения: System.ArrayTypeMismatchException
Сообщение: Тип исходного массива не может быть назначен типу целевого массива.
Я нахожу это исключение очень своеобразным, потому что
-
ArrayTypeMismatchException
- Я ничего не делаю с массивами. Это, по-видимому, внутреннее исключение. -
Cast<sbyte>
работает отлично (как в первом примере), при использованииToArray
илиToList
проблема возникает.
Я ориентирую .NET v4 x86, но то же самое происходит и в 3.5.
Мне не нужны какие-либо советы о том, как решить проблему, я уже успел это сделать. Я хочу знать, почему это происходит в первую очередь?
ИЗМЕНИТЬ
Даже более странно, добавляя бессмысленный оператор select, оператор ToList
работает правильно:
var baz = bar.Select(x => x).ToList();