首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >组合函数将导致应用程序崩溃,而不会出现任何异常

组合函数将导致应用程序崩溃,而不会出现任何异常
EN

Stack Overflow用户
提问于 2020-10-08 22:18:28
回答 2查看 63关注 0票数 1

组合函数将使应用程序崩溃,而不会出现任何错误。即使周围使用try-catch也无济于事。

详细信息

在应用程序中,我能够为正在处理的数据指定过滤器。当我只有一个筛选器时,它工作得很好,但是当有多个筛选器和||操作符组合在一起时,应用程序(asp.net核心3.1)就会停止调试,不会抛出任何异常。

示例测试不会通过,不会失败,而只是崩溃,没有任何异常:

代码语言:javascript
复制
[Fact]
public void ShouldFilterWithFilterGroup()
{
    // Arrange
    var filters = new List<Func<object, bool>>();
    filters.Add(x => true);
    filters.Add(x => true);

    Func<object, bool> filterFunction = null;
    foreach (var item in filters)
    {
        if (filterFunction == null)
        {
            filterFunction = x => item(x);
        }
        else
        {
            filterFunction = x => filterFunction(x) || item(x);
        }
    }

    // Act
    var filterResult = filterFunction(null); // Test just stops here without throwing any exception

    // Assert
    Assert.True(filterResult);
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-10-08 22:34:01

是的,你有一个递归。不要手动操作,已经有一种方法可以用“or”来检查所有这些参数:

代码语言:javascript
复制
var result = filters.Any(filter => filter(input));

如果你确实需要一个单独的函数来传递,你也可以这样做:

代码语言:javascript
复制
Func<object, bool> filterGroup = (input) => filters.Any(filter => filter(input));
票数 0
EN

Stack Overflow用户

发布于 2020-10-08 22:26:00

我的猜测是你有一个无限循环。filterFunction将在没有任何退出条件的情况下调用自身。这最终会导致堆栈溢出异常。

要修复它,请尝试将filterfunction赋给一个局部变量:

代码语言:javascript
复制
var localFunction = filterFunction;
filterFunction = x => localFunction(x) || item(x);
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64264503

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档