3
let a = [1;2;3;]

for i in (a |> Seq.take 10) do Console.WriteLine(i)
for i in (a |> Seq.take 100) do Console.WriteLine(i)

最初の行は正常に機能しますが、2 行目でエラーが発生します:入力シーケンスの要素数が不十分です。

はい、100 個の要素はありません。それらは 3 つだけですが、なぜ 10 個が機能するのでしょうか。

オンラインテスト

やっぱりC#で動く

using System;
using System.Linq;

class P
{ static void Main() {

 var p = new[] {1,2,3,4};

 foreach(var i in p.Take(10).ToArray()) Console.WriteLine(i);
 foreach(var i in p.Take(2).ToArray()) Console.WriteLine(i);
 foreach(var i in p.Take(100).ToArray()) Console.WriteLine(i);
}}

オンラインテスト

4

3 に答える 3

8

3つの要素を出力してから、エラーメッセージを出力します。

于 2011-04-04T12:51:32.280 に答える
6

他の回答であなたの間違いが説明されています(コンパイラのバグについての結論にジャンプしないようにすることをお勧めします。おそらく反対票が投じられるでしょう)。また、Seq.take と Enumerable.Take を比較していますが、動作は同じではありません。ただし、Seq.truncateEnumerable.Take と同じ動作をします。

于 2011-04-04T13:21:58.990 に答える
4

サンプルでは、​​2番目のforループはまったく実行されません。最初の1つは123を出力し、次に例外をスローします

于 2011-04-04T12:51:21.597 に答える