この不自然で些細な例を考えてみましょう。
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);
}
2の補数の魔法で、-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();