在什么情况下 TypeBuilder.CreateType return 可以为空?

Under what conditions can TypeBuilder.CreateType return null?

TypeBuilder.CreateType()方法定义as nullable:

public Type? CreateType();

什么情况下可以return为null?文档没说。

我可以深入研究源代码,但这会产生一个不可信的答案(尽管很有趣)。我错过了这个签名的书面解释吗?

Inter-site-crosspost-ahoy: https://github.com/dotnet/dotnet-api-docs/issues/7955


Under what conditions can TypeBuilder.CreateType() return null?

TL;DR: 没有情况 when TypeBuilder.CreateType() will return null when CreateType() is being by called user-code。您可以安全地将 null-forgiving ! 添加到 CreateType() call-site.


当前源位于https://github.com/dotnet/runtime/blob/1a296c06fff8750b4658f6f7d901347e006744d0/src/coreclr/System.Private.CoreLib/src/System/Reflection/Emit/TypeBuilder.cs#L1853

  • 快速浏览当前源显示 TypeBuilder.CreateType() 只有 return s nullTypeBuilder 是程序集的隐藏 <Module> 的构建器时class。
    • <Module> class 是一种允许 assemblies/modules 具有 eager-initialized 全局变量的特殊类型。
    • C# 语言本身不使用 <Module>,但其他语言使用(例如 C++/CLI)。
    • 自 C# 9.0 起,you can now opt-in to adding <Module> members 通过 [ModuleInitializer] 属性。
    • 当然,如果您使用的是 Reflection.Emit,那么在 2001 年回到 .NET 1.x 时,您将始终能够使用 ModuleBuilder
  • <Module>-构建 TypeBuilder 实例不能由 user-code 直接实例化,因为它需要特定的 internal TypeBuilder() 构造函数调用 - 相反,仅当您使用ModuleBuilder 类型。
  • 只有TypeBuilder.CreateType()方法确实returnnullvoid ModuleBuilder.CreateGlobalFunctions()里面的唯一情况,基本保证了class <Module>会在生成的dynamic-assembly.
  • 中定义
  • 因此,虽然 Type? TypeBuilder.CreateType() 的 return-type 上的可空注释在技术上是正确的 (the best kind of correct),但它之所以存在是因为当前API 设计很差:当其中一个案例也是 internal-only 时,它对两个单独的 use-cases 使用单一方法。