考虑这个人为的、简单的例子:
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's 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();