C# 组合函数将使应用程序毫无例外地崩溃 组合函数将使应用程序崩溃而不会出现任何错误。即使周围有试捕也无济于事。 细节

C# 组合函数将使应用程序毫无例外地崩溃 组合函数将使应用程序崩溃而不会出现任何错误。即使周围有试捕也无济于事。 细节,c#,asp.net-core,.net-core,C#,Asp.net Core,.net Core,在应用程序中,我能够为正在处理的数据指定过滤器。当我只有一个过滤器时,它可以正常工作,但是当有多个过滤器与|操作符组合时,应用程序(asp.net core 3.1)会停止调试,而不会抛出任何异常 示例测试不会通过,也不会失败,但会毫无例外地崩溃: [事实] public void应使用FilterGroup()进行筛选 { //安排 var filters=新列表(); filters.Add(x=>true); filters.Add(x=>true); Func filterFunctio

在应用程序中,我能够为正在处理的数据指定过滤器。当我只有一个过滤器时,它可以正常工作,但是当有多个过滤器与
|
操作符组合时,应用程序(asp.net core 3.1)会停止调试,而不会抛出任何异常

示例测试不会通过,也不会失败,但会毫无例外地崩溃:
[事实]
public void应使用FilterGroup()进行筛选
{
//安排
var filters=新列表();
filters.Add(x=>true);
filters.Add(x=>true);
Func filterFunction=null;
foreach(过滤器中的变量项)
{
if(filterFunction==null)
{
filterFunction=x=>项(x);
}
其他的
{
filterFunction=x=>filterFunction(x)| |项(x);
}
}
//表演
var filterResult=filterFunction(null);//测试仅在此处停止,不会引发任何异常
//断言
Assert.True(filterResult);
}

我猜你有一个无限循环<代码>过滤器函数将在没有任何退出条件的情况下调用自身。这最终会导致stackoverflow异常

要修复此问题,请尝试将filterfunction分配给局部变量:

var localFunction = filterFunction;
filterFunction = x => localFunction(x) || item(x);

我猜你有一个无限循环<代码>过滤器函数将在没有任何退出条件的情况下调用自身。这最终会导致stackoverflow异常

要修复此问题,请尝试将filterfunction分配给局部变量:

var localFunction = filterFunction;
filterFunction = x => localFunction(x) || item(x);

是的,你有一个递归。不要手动执行此操作,已经有一种方法可以使用“或”检查所有这些选项:

如果您确实需要传递单个函数,也可以这样做:

Func<object, bool> filterGroup = (input) => filters.Any(filter => filter(input));
Func filterGroup=(输入)=>filters.Any(filter=>filter(输入));

是的,您有一个递归。不要手动执行此操作,已经有一种方法可以使用“或”检查所有这些选项:

如果您确实需要传递单个函数,也可以这样做:

Func<object, bool> filterGroup = (input) => filters.Any(filter => filter(input));
Func filterGroup=(输入)=>filters.Any(filter=>filter(输入));


这是StackOverflow异常。可能存在无终止的重复,请首先检查filterfunction中的函数。您定义了filterfunction来调用filterfunction,这样您将以递归结束。
bool filterfunction(object x){return filterfunction(x)| item(x)}
将是等效的,没有?所以你有其他的答案来解释为什么会出现这种情况,但是正确地做这件事实际上比这更容易。您只需执行
var filterFunction=filters.Aggregate((a,b)=>x=>a(x)| | b(x))这是StackOverflow异常。可能会出现无终止的重复,请先检查filterfunction中的函数。您定义了filterfunction来调用filterfunction,因此最终会出现递归。
bool filterfunction(object x){return filterfunction(x)| item(x)}
将是等效的,没有?所以你有其他的答案来解释为什么会出现这种情况,但是正确地做这件事实际上比这更容易。您只需执行
var filterFunction=filters.Aggregate((a,b)=>x=>a(x)| | b(x))据我所知,c#编译器不支持尾部调用优化。@asawyer你能对所有的抖动说同样的话吗?(我不知道是否有/哪些支持它)@asawyer你说得对,编译器没有尾部调用优化。我仍然认为这是允许的。无论如何,它可能与本案无关,因此删除提及它的内容。@Servy我不知道该说实话。这些年来,我没有跟上抖动的变化。我想在某些情况下会有一些,但我甚至不知道从哪里开始寻找关于它的文档。这个问题在这个主题上有一些有趣的阅读,但答案已经有几年了,据我所知,c#编译器不支持尾部调用优化。@asawyer你能对所有的不安说同样的话吗?(我不知道是否有/哪些支持它)@asawyer你说得对,编译器没有尾部调用优化。我仍然认为这是允许的。无论如何,它可能与本案无关,因此删除提及它的内容。@Servy我不知道该说实话。这些年来,我没有跟上抖动的变化。我想在某些情况下会有一些,但我甚至不知道从哪里开始寻找关于它的文档。这个问题在这个主题上有一些有趣的阅读,但答案已经有几年了,现在可能已经过时了。这是在评估每个函数,而不是创建一个新函数,谁的结果是这些函数的OR。在这种情况下,如果OP在意,这只会是“错误的”。我们不知道。@Fildor嗯,这就是他们问的关于做什么的问题。如果你想断言他们不需要做他们要求的事情,你需要证明这是事实,而不仅仅是假设。这就是问题的关键:我什么都不假设。我对问题中的一些x-y组件的可能性持开放态度。@Servy如果您真的认为需要一个新函数,我们可以使它
Func filterGroup=(input)=>filters.Any(filter=>filter(input))但这不是真正的问题。这是评估每个函数,而不是创建一个新函数,谁的结果是每个函数的OR。在这种情况下,如果OP不在意,这只会是“错误的”。我们不知道。@Fildor嗯,这就是他们问的关于做什么的问题。如果你想断言他们不需要做他们要求的事情,你需要证明这是事实,而不仅仅是假设。这就是问题的关键:我什么都不假设。我愿意在这个问题中加入一个小的x-y组件。@Servy如果你真的认为有一个新的函数