Appearance
FAQ 分册 3:生成代码错误
Q11:生成的代码有编译错误
- 症状:
obj/generated里已经有文件,但项目编译失败 - 可能原因:命名空间不对、类声明不完整、缺
partial、泛型参数没带回去、字符串模板拼错 - 解决方案:先打开生成的
.g.cs,把它当普通 C# 文件逐行排查,不要只盯着生成器源码 - 相关章节:第 9 章、第 11 章
- 相关术语:SourceProductionContext、AddSource(...)、INamedTypeSymbol
Q12:如何处理可空引用类型?
- 症状:
string?属性生成出的代码容易空引用,或者输出不正确 - 可能原因:把可空引用类型和普通引用类型当成同一种情况处理
- 解决方案:通过
NullableAnnotation判断是否标注可空,再决定是否使用?.ToString() ?? "null" - 相关章节:第 10 章、第 11 章
- 相关术语:ITypeSymbol、NullableAnnotation
Q13:泛型类的代码生成失败
- 症状:普通类能生成,
Container<T>这类泛型类一生成就报错 - 可能原因:生成类声明时忘了补
<T>,或者没有处理泛型约束 - 解决方案:先从
INamedTypeSymbol.TypeParameters取回参数,再从每个ITypeParameterSymbol恢复约束 - 相关章节:第 10 章、第 11 章
- 相关术语:INamedTypeSymbol、ITypeParameterSymbol、TypeParameters
Q14:嵌套类的代码生成不正确
- 症状:外层类和内层类结构对不上,或者生成成员跑到了错误层级
- 可能原因:只恢复了当前类名,没有恢复
ContainingType链 - 解决方案:从
symbol.ContainingType一层层往外走,把所有外层类型壳子补回去 - 相关章节:第 10 章、第 11 章
- 相关术语:ContainingType、INamedTypeSymbol
最推荐的排查顺序
- 先打开生成出来的
.g.cs - 看命名空间和外层类型结构
- 看目标类声明是否带上
partial、泛型参数、约束 - 看方法体里的字符串模板或代码拼接
- 再回头定位到底是哪段生成逻辑把这些信息丢了
下一步去哪里
- 如果问题其实出在测试与调试链路:看 FAQ 分册 4:测试、调试与驱动结果
- 返回 FAQ 首页:看 常见问题与排错