OpCodes.Constrained 字段
定义
重要
一些信息与预发行产品相关,相应产品在发行之前可能会进行重大修改。 对于此处提供的信息,Microsoft 不作任何明示或暗示的担保。
约束要对其进行虚方法调用的类型。
public: static initonly System::Reflection::Emit::OpCode Constrained;
public static readonly System.Reflection.Emit.OpCode Constrained;
staticval mutable Constrained : System.Reflection.Emit.OpCode
Public Shared ReadOnly Constrained As OpCode
字段值
注解
下表列出了指令的十六进制和 Microsoft 中间语言 (MSIL) 程序集格式,以及简短的参考摘要:
格式 | 程序集格式 | 说明 |
---|---|---|
FE 16 <T > |
约束。 thisType |
对受约束 T 为 类型的类型调用虚拟方法。 |
constrained
仅允许在指令上使用callvirt
前缀。
此时 MSIL 堆栈的状态必须如下所示:
托管指针
ptr
将推送到堆栈上。 的类型ptr
必须是指向 的托管指针 (&
)thisType
。 请注意,这与未准备callvirt
的指令的情况不同,后者需要引用thisType
。方法参数
arg1
通过argN
推送到堆栈上,就像使用未设置callvirt
的指令一样。
前缀 constrained
旨在允许 callvirt
以统一的方式发出指令,而不考虑是值类型还是 thisType
引用类型。
当指令 callvirt
method
已以 constrained
thisType
为前缀时,将按如下所示执行该指令:
如果
thisType
是引用类型 (而不是值类型) 则ptr
取消引用并作为 指向 的method
“this”指针callvirt
传递。如果
thisType
是值类型并thisType
实现method
,则ptr
作为指向指令的“this”指针call
method
进行未修改的传递,以便由thisType
实现method
。如果
thisType
是值类型且thisType
未实现method
,则ptr
取消引用、装箱并作为指向指令的“this”指针callvirt
method
传递。
仅当 在 、 或 上Object定义并且未被 thisType
重写时method
,才会发生最后一种Enum情况。 ValueType 在这种情况下,装箱会导致创建原始对象的副本。 但是,由于 、 ValueType和 Enum 的任何Object方法均未修改对象的状态,因此无法检测到此事实。
前缀 constrained
支持创建泛型代码的 IL 生成器。 通常,指令 callvirt
对值类型无效。 相反,IL 编译器需要在编译时有效地执行上面概述的“this”转换,具体取决于 ptr
的类型和调用的方法。 但是,如果 ptr
是编译时未知的泛型类型,则无法在编译时进行此转换。
opcode constrained
允许 IL 编译器以统一的方式调用虚拟函数,而不管它是值类型还是 ptr
引用类型。 尽管它适用于泛型类型变量的情况 thisType
,但前缀也适用于非泛型类型, constrained
并且可以降低在隐藏值类型和引用类型之间区别的语言中生成虚拟调用的复杂性。
constrained
使用 前缀还可以避免值类型出现潜在的版本控制问题。 constrained
如果未使用前缀,则必须发出不同的 IL,具体取决于值类型是否替代 System.Object 的方法。 例如,如果值类型 V
替代 Object.ToString () 方法,则会发出指令 call
V.ToString()
;否则, box
将发出指令和 callvirt
Object.ToString()
指令。 如果以后删除替代,在前一种情况下,可能会出现版本控制问题;如果稍后添加替代,则后一种情况可能会出现版本控制问题。
前缀 constrained
还可用于对值类型调用接口方法,因为可以使用 更改 MethodImpl
实现接口方法的值类型方法。 constrained
如果未使用前缀,则强制编译器选择要在编译时绑定到的值类型的方法。 constrained
使用 前缀允许 MSIL 绑定到在运行时(而不是编译时)实现接口方法的方法。
以下 Emit 方法重载可以使用 constrained
opcode:
适用于
反馈
https://aka.ms/ContentUserFeedback。
即将发布:在整个 2024 年,我们将逐步淘汰作为内容反馈机制的“GitHub 问题”,并将其取代为新的反馈系统。 有关详细信息,请参阅:提交和查看相关反馈