You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C#实现单参数函数转Lazy延迟版本的代码报错解决

错误点说明

你的代码存在两个直接导致运行失败、不符合预期的问题:

  • 返回类型声明错误:方法体返回的是x => ...格式的lambda表达式,本质是一个接收int参数的函数,和你声明的Lazy<int>返回类型完全不匹配
  • 延迟逻辑完全失效:new Lazy<int>(f1(x))会在构造Lazy实例的瞬间立刻执行f1(x)计算结果,根本没有延迟效果。Lazy构造函数需要传入无参的结果计算委托,只有当代码访问Lazy的Value属性时,才会触发这个委托执行计算,你直接传入f1的执行结果相当于提前完成了计算,违背了Lazy的设计目的。
正确实现

针对int入参、int返回的固定场景,修正后的代码如下:

public static Func<int, Lazy<int>> memo2(Func<int, int> f1)
{
    return x => new Lazy<int>(() => f1(x));
}

调用示例:

// 转换得到延迟版本的函数
var lazyFunc = memo2(n => n * 2);
// 传入参数拿到Lazy实例,此时传入的计算逻辑还未执行
var lazyResult = lazyFunc(99);
// 第一次访问Value属性时,才会真正执行n*2的计算得到结果198
int result = lazyResult.Value;

如果需要适配任意类型的单参数函数,可以写泛型版本通用实现:

public static Func<TArg, Lazy<TReturn>> ToLazyFunc<TArg, TReturn>(Func<TArg, TReturn> sourceFunc)
{
    return arg => new Lazy<TReturn>(() => sourceFunc(arg));
}

如果你需要实现记忆化效果(相同参数多次调用只执行一次计算、缓存结果),可以在方法内部加一个线程安全的字典存储对应参数的Lazy实例即可,基础延迟转换逻辑和上面一致。

内容的提问来源于stack exchange,提问作者Bartolinio Kooperinio

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.30 10:33:25