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

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参数的类型:

  1. 先推断最外层list.Sum的Lambda参数a为Container类型;
  2. 接着处理a.Items.Sum,需要推断参数b的类型为Container;
  3. 最后处理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.

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.16 20:09:58