gpt4 book ai didi

c# - 序列上的扩展方法不会抛出异常,除非我使用 ToList()

转载 作者:太空宇宙 更新时间:2023-11-03 18:56:20 25 4
gpt4 key购买 nike

我现在正在研究扩展方法,并且我构建了一个适用于部分序列的方法。如果该部分传递的维度不是严格正数,它应该抛出 ArgumentOutOfRangeException,但在我的 nunit 测试中,我设法使其仅通过对函数的结果调用 ToList() 来抛出异常。这是我的代码:

    public static class ExClass {
public static IEnumerable<T> SplitAndReverse<T>(this IEnumerable<T> sequence, int size) {
// Check if sequence is null
if (size <= 0)
throw new ArgumentOutOfRangeException("size can only be a positive number");
// Do something
}
}
}

[TestFixture]
public class TestClass {

[TestCase(0)]
public void Test2(int range)
{
Assert.That(() => Enumerable.Range(1,10).SplitAndReverse(range).ToList(), Throws.TypeOf<ArgumentOutOfRangeException>());
}
}

我还尝试删除 ToList() 方法并将结果保存在 var 中。该 var 中的值在此屏幕截图中,但我不太了解它。在最后一行中,Items 似乎抛出了 ArgumentOutOfRangeException(为什么以及为什么由 Items 抛出?)。在倒数第二行中,它表明“ArgumentOutOfRangeException”类型不是有效类型(同样,为什么?)。

While debugging the result of the method

可能有助于了解的最后一件事是,如果没有 ToList() 方法,我无法设法在 Debug模式下进入该方法,而使用它可以毫无问题地进入。我有另一个测试,它只将有效参数传递给函数,从那个测试我可以设法进入方法(它也按预期工作)。

最佳答案

Enumerable.Range(1,10).SplitAndReverse(range) 只是一个查询,如果没有 .ToList(),则无法对查询进行评估(这就是调试器不起作用的原因,因为没有 ToList()SplitAndReverse 就不会执行)。 LINQ 查询是惰性评估的,仅当您使用 foreach 枚举它们或调用其中一种具体化方法(例如 ToList()ToArray() 时才执行Count()FirstOrDefault()

关于c# - 序列上的扩展方法不会抛出异常,除非我使用 ToList(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44465790/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com