定义了TypeBuilder.CreateType()
方法as nullable :
public Type? CreateType();
什么情况下可以返回null?文档没有说。
我可以深入研究源代码,但这会产生一个不可信的答案(尽管很有趣)。我错过了这个签名的书面解释吗?
最佳答案
站点间交叉发布啊嘿:https://github.com/dotnet/dotnet-api-docs/issues/7955
Under what conditions can
TypeBuilder.CreateType()
returnnull
?
TL;DR:不存在以下情况:TypeBuilder.CreateType()
将返回null
当CreateType()
正在被用户代码调用。您可以安全地添加一个 null-forgiving !
到 CreateType()
调用站点。
- 快速浏览当前源代码表明
TypeBuilder.CreateType()
只返回null
当TypeBuilder
是程序集隐藏的构建器<Module>
类(class)。<Module>
类是一种特殊类型,允许程序集/模块具有急切初始化的全局变量。- C# 语言本身不使用
<Module>
,尽管其他语言也可以(例如 C++/CLI)。 - 自 C# 9.0 起,you can now opt-in to adding
<Module>
members通过[ModuleInitializer]
属性。 - 当然,如果您使用
Reflection.Emit
那么您将始终能够使用ModuleBuilder
回到 2001 年的 .NET 1.x。
-
<Module>
-建筑TypeBuilder
实例不能直接由用户代码实例化,因为它需要特定的internal TypeBuilder()
构造函数调用 - 相反,仅当您使用ModuleBuilder
时才会调用此构造函数类型。 - 唯一的情况是
TypeBuilder.CreateType()
方法确实返回null
在里面void ModuleBuilder.CreateGlobalFunctions()
,这基本上确保了class <Module>
将在生成的动态程序集中定义。 - 因此,虽然
Type? TypeBuilder.CreateType()
上的可为空注释的返回类型在技术上是正确的 ( the best kind of correct ),它之所以存在只是因为当前的 API 设计很差:它对两个单独的用例使用单一方法,而其中一种情况也存在internal
-仅限。
关于c# - 什么情况下TypeBuilder.CreateType可以返回null?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71804436/