record 里加了个 List,IL2CPP 构建直接炸了
栏目:Unity Bug挑战 | 期号:NO.008 | 日期:2026-10-29 | 4星 · 中高级 | Bug挑战 | Unity 2022.3 LTS · Android
类型:构建 / IL2CPP
环境:Unity 2022.3 LTS · Android
🐛 Bug 现场
项目里有一套配置系统,用 ScriptableObject 存各个系统的配置数据。最近做代码重构,为了让配置数据不可变、支持 with 表达式快速拷贝,把几个数据类改成了 C# 9 的 record 类型。
改完之后,Editor 里跑一切正常,Mono 构建也没问题。直到上周打 Android IL2CPP 包的时候,构建直接崩了。
简化后的代码如下(已脱敏):
public record SkillConfig { public string SkillId { get; init; } public int Damage { get; init; } public float Cooldown { get; init; } public List<EffectConfig> Effects { get; init; } } public record EffectConfig { public string EffectType { get; init; } public float Value { get; init; } public List<ParamConfig> Params { get; init; } } public record ParamConfig { public string Key { get; init; } public string Value { get; init; } }三层 record 嵌套,每层都有 List。看着人畜无害对吧?
💥 诡异现象
预期:record 就是个语法糖,本质还是 class,IL2CPP 应该正常处理才对。Editor 和 Mono 都没问题,IL2CPP 怎么会挂?
实际:Android IL2CPP 构建在编译 C++ 阶段直接报错,错误信息如下:
fatal error: bracket nesting level exceeded maximum of 256 note: use -fbracket-depth=N to increase maximum nesting level 1 error generated.报错位置在 IL2CPP 生成的 Assembly-CSharp__12.cpp 第 21955 行第 4042 列——一行代码有四千多列,C++ 编译器直接说「括号嵌套太深了,我不干了」。
更诡异的是:把 Effects 那行 List 去掉,构建就过了。或者把 record 改成普通 class,也过了。
就是 record + List + 多层嵌套这个组合,精准触发了 IL2CPP 的某个雷区。
🤔 你的任务
请分析以下三个问题:
为什么 record + 泛型集合嵌套会导致 IL2CPP 生成的 C++ 代码括号嵌套超过 256 层?record 类型到底让 IL2CPP 多生成了什么?
为什么 Editor/Mono 没问题,只有 IL2CPP 会炸?这是 IL2CPP 的 bug 还是预期行为?
除了「改回 class」之外,你能想到几种修复方案?各自的 trade-off 是什么?
💡 想到答案了吗?
评论区留下你的思路,答案稍后揭晓
#Unity #Bug挑战 #IL2CPP #C# #Android构建
标签:Unity、Bug挑战、IL2CPP、C#、Android构建