C# CS9236编译错误解析:示例演示与显式类型必要性说明
CS9236 编译错误详解与解决方案
错误说明
CS9236 是C#编译器的类型推断限制错误:当编译器尝试为隐式类型Lambda表达式进行类型绑定时,尝试次数超过100次的内置阈值时触发。错误提示给出两种解决方向:为Lambda表达式声明显式参数类型,或为泛型方法调用指定显式类型实参。
示例代码分析
你提供的代码包含三层嵌套的Sum泛型方法调用,每层都使用了隐式类型的Lambda参数:
using System.Linq; using System.Collections.Generic; class Container { public IEnumerable<Container> Items; public int Value; } class Program { static void Main() { var list = new List<Container>(); _ = list.Sum( a => a.Items.Sum( b => b.Items.Sum( c => c.Value))); } }
编译器处理这段代码时,需要从最外层向内逐层推断每个Lambda参数的类型:
- 先推断最外层
list.Sum的Lambda参数a为Container类型; - 接着处理
a.Items.Sum,需要推断参数b的类型为Container; - 最后处理
b.Items.Sum,推断参数c的类型为Container。
由于泛型方法Sum的类型推断需要多次绑定尝试,叠加三层嵌套的累积效应,总绑定次数超过了100次的阈值,因此触发CS9236错误。
为什么显式类型是合理的优化方案
- 避免触发推断阈值:显式指定参数类型后,编译器无需反复尝试绑定类型,直接使用开发者指定的类型,从根源上规避次数超限问题;
- 提升代码可读性:多层嵌套场景下,隐式类型Lambda会增加代码的理解成本,显式类型能让其他开发者一眼明确参数类型;
- 降低编译开销:复杂嵌套的类型推断会产生递归尝试的性能消耗,显式类型能直接缩短编译过程。
修复后的代码
为每个Lambda参数添加显式类型声明即可解决错误:
using System.Linq; using System.Collections.Generic; class Container { public IEnumerable<Container> Items; public int Value; } class Program { static void Main() { var list = new List<Container>(); _ = list.Sum( (Container a) => a.Items.Sum( (Container b) => b.Items.Sum( (Container c) => c.Value))); } }
内容的提问来源于stack exchange,提问作者TN.
相关产品推荐
相关产品推荐

