考慮這一點做作,簡單的例子:爲什麼Linq在使用ToList時失敗?
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);
}
二進制補碼的魔力,-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();
隨着'Select'它導致'{-10,127}'。這裏有一個鑄造問題。肯定有趣的錯誤消息。 – asawyer
@Lieven是的,我收集了多少,爲什麼'ToList'前的'Select(x => x)'更正了它?這是一個毫無意義的預測,因爲同樣的事情會回來。 – vcsjones
我有一個解釋...它只是花一點時間寫出來。很好的問題。 –