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

为什么通过for循环插入List的委托相等,直接插入的委托不相等?

差异原因核心分析
  • 先明确C#委托相等的判定规则

两个委托实例相等需要同时满足:Method属性指向同一个方法实现、Target属性指向同一个关联对象,多播委托的调用列表结构完全一致。

  • 手动两次添加Lambda输出不等的原因
    你在两行独立代码中分别定义的两个Lambda,在C# 5及更早版本的编译器逻辑里,属于不同语法位置的匿名函数,就算逻辑完全一致、没有捕获任何外部变量,编译器也不会做跨位置的实例缓存,会分别生成两个不同的私有方法对应两个Lambda,最终创建的两个委托指向不同的方法,自然不相等,所以输出Two Delegates did not match。
  • for循环内添加Lambda输出相等的原因
    循环里的Lambda仅出现在同一个语法位置,每次循环只是重复执行同一段添加逻辑,编译器会识别到这个Lambda没有捕获外部变量,会将生成的委托实例做静态缓存,每次Add操作实际都是把同一个缓存好的委托实例加入列表,列表里的两个元素本质是同一个对象,Equals判断自然返回true,所以输出Two Delegates are equal。

补充说明:C# 6及之后的Roslyn编译器优化了无捕获Lambda的缓存规则,同一个方法内所有逻辑一致、无外部变量捕获的Lambda都会复用同一个委托实例,这种情况下第一种手动两次添加的写法也会输出两个委托相等。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 02:36:08