可以给出意想不到的输出

class Foo { public static IEnumerable Range(int start, int end) { return Enumerable.Range(start, end); } public static void PrintRange(IEnumerable r) { foreach (var item in r) { Console.Write(" {0} ", item); } Console.WriteLine(); } } class Program { static void TestFoo() { Foo.PrintRange(Foo.Range(10, 20)); } static void Main() { TestFoo(); } } 

预期产出:

 10 11 12 13 14 15 16 17 18 19 20 

实际产量:

 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 

这段代码有什么问题? 发生了什么?

Enumerable.Range的第二个参数指定要生成的整数数,而不是该范围中的最后一个整数。

如有必要,可以轻松构建自己的方法,或更新现有的Foo.Range方法,从startend参数生成范围。

Range第二个参数是要生成的项目数。

它为什么不结束而是计数?

如果你有起点和终点,你如何枚举一个空的范围? 例如,假设您在屏幕上有一个文本缓冲区和一个选择,并且选择是从字符12开始到字符12结尾的单个字符。您如何枚举该范围? 您枚举从字符12开始的一个字符。

现在假设选择是ZERO字符。 你怎么列举它? 如果你有开始,大小,你只需要传递零大小。 如果你有开始,结束,你做什么? 你无法通过12和12。

现在你可能会说“好吧,如果它是一个空的范围,就不要枚举它”。 所以你最终得到的代码应该是这样的:

 var results = from index in Range(selectionStart, selectionSize) where blah blah blah select blah; 

而是写作

 IEnumerable results = null; if (selectionSize == 0) { results = Enumerable.Empty(); } else { results = from index in Range(selectionStart, selectionEnd) where blah blah blah select blah; } 

这伤害了我的眼睛。