Skip to content

FAQ 分册 3:生成代码错误

Q11:生成的代码有编译错误

  • 症状:obj/generated 里已经有文件,但项目编译失败
  • 可能原因:命名空间不对、类声明不完整、缺 partial、泛型参数没带回去、字符串模板拼错
  • 解决方案:先打开生成的 .g.cs,把它当普通 C# 文件逐行排查,不要只盯着生成器源码
  • 相关章节:第 9 章第 11 章
  • 相关术语:SourceProductionContextAddSource(...)INamedTypeSymbol

Q12:如何处理可空引用类型?

  • 症状:string? 属性生成出的代码容易空引用,或者输出不正确
  • 可能原因:把可空引用类型和普通引用类型当成同一种情况处理
  • 解决方案:通过 NullableAnnotation 判断是否标注可空,再决定是否使用 ?.ToString() ?? "null"
  • 相关章节:第 10 章第 11 章
  • 相关术语:ITypeSymbolNullableAnnotation

Q13:泛型类的代码生成失败

  • 症状:普通类能生成,Container<T> 这类泛型类一生成就报错
  • 可能原因:生成类声明时忘了补 <T>,或者没有处理泛型约束
  • 解决方案:先从 INamedTypeSymbol.TypeParameters 取回参数,再从每个 ITypeParameterSymbol 恢复约束
  • 相关章节:第 10 章第 11 章
  • 相关术语:INamedTypeSymbolITypeParameterSymbolTypeParameters

Q14:嵌套类的代码生成不正确

  • 症状:外层类和内层类结构对不上,或者生成成员跑到了错误层级
  • 可能原因:只恢复了当前类名,没有恢复 ContainingType
  • 解决方案:从 symbol.ContainingType 一层层往外走,把所有外层类型壳子补回去
  • 相关章节:第 10 章第 11 章
  • 相关术语:ContainingTypeINamedTypeSymbol

最推荐的排查顺序

  1. 先打开生成出来的 .g.cs
  2. 看命名空间和外层类型结构
  3. 看目标类声明是否带上 partial、泛型参数、约束
  4. 看方法体里的字符串模板或代码拼接
  5. 再回头定位到底是哪段生成逻辑把这些信息丢了

下一步去哪里

基于当前仓库文档副本构建的 VitePress 站点