C#实现Func<int,bool>取反返回相反布尔值的高阶函数方法
错误原因
你当前写的y => !y逻辑不符合委托高阶函数的要求:
- 参数
y是Func<int,bool>类型的委托实例,本身不是布尔值,直接对委托对象用!取反本身就不符合类型逻辑 - 你没有构造符合返回值要求的
Func<int,bool>委托:not作为高阶函数,需要返回一个接收int入参的新委托,在新委托内部调用原始传入的委托y,拿到布尔返回值后再做取反。
修正代码
只需要在lambda中嵌套一层内层lambda,构造符合签名的返回委托即可:
Func<Func<int,bool>, Func<int, bool>> not = y => x => !y(x); Func<int, bool> equalTo0 = x => x == 0; var test3 = not(equalTo0)(5); // 运行结果为true,符合预期
你给出的预期示例也能正常运行:
// 测试奇偶判断场景 var isEven = x => x % 2 == 0; Console.WriteLine(not(isEven)(1)); // 输出True Console.WriteLine(not(isEven)(2)); // 输出False
执行逻辑说明
- 调用
not(传入委托)时,会返回一个新的Func<int,bool>委托,这个委托记住了原始传入的委托y - 当你给返回的新委托传入int参数(比如示例里的5、1、2)时,实际执行的逻辑是:把int参数传给原始委托y拿到布尔结果,再对这个结果取反返回。比如
not(equalTo0)(5)实际等价于!(5 == 0),计算结果为true。
内容的提问来源于stack exchange,提问作者yourickmovies
相关产品推荐
相关产品推荐

