在什么情况下 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.
- 快速浏览当前源显示
TypeBuilder.CreateType()
只有 return s null
当 TypeBuilder
是程序集的隐藏 <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()
方法做确实returnnull
在void ModuleBuilder.CreateGlobalFunctions()
里面的唯一情况,基本保证了class <Module>
会在生成的dynamic-assembly. 中定义
- 因此,虽然
Type? TypeBuilder.CreateType()
的 return-type 上的可空注释在技术上是正确的 (the best kind of correct),但它之所以存在是因为当前API 设计很差:当其中一个案例也是 internal
-only 时,它对两个单独的 use-cases 使用单一方法。
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()
returnnull
?
TL;DR: 没有情况 when TypeBuilder.CreateType()
will return null
when CreateType()
is being by called user-code。您可以安全地将 null-forgiving !
添加到 CreateType()
call-site.
- 快速浏览当前源显示
TypeBuilder.CreateType()
只有 return snull
当TypeBuilder
是程序集的隐藏<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()
方法做确实returnnull
在void ModuleBuilder.CreateGlobalFunctions()
里面的唯一情况,基本保证了class <Module>
会在生成的dynamic-assembly. 中定义
- 因此,虽然
Type? TypeBuilder.CreateType()
的 return-type 上的可空注释在技术上是正确的 (the best kind of correct),但它之所以存在是因为当前API 设计很差:当其中一个案例也是internal
-only 时,它对两个单独的 use-cases 使用单一方法。