C# Castclass操作码是必需的吗?
CLR允许我使用对象引用设置字段,而不管是否执行了C# Castclass操作码是必需的吗?,c#,.net,reflection.emit,il,C#,.net,Reflection.emit,Il,CLR允许我使用对象引用设置字段,而不管是否执行了Castclass操作。如果确定堆栈顶部的对象引用为AppPeriate类型,则可以设置字段吗?如果是这样,这是否意味着Castclass是编译器使用的安全功能?当您编写CIL时,您是在虚拟堆栈基础语言而不是OOP语言上编写的 Castclass是一个可选的操作码,用于确保引用地址是您想要的类,因为在CIL中,一切都很容易搞乱 这是一个示例,我只是将变体A从CA类型更改为CB类型,将股票实例CB从B更改为A(类似于您在中所做的) @Asad-Co
Castclass
操作。如果确定堆栈顶部的对象引用为AppPeriate类型,则可以设置字段吗?如果是这样,这是否意味着Castclass
是编译器使用的安全功能?当您编写CIL时,您是在虚拟堆栈基础语言而不是OOP语言上编写的
Castclass是一个可选的操作码,用于确保引用地址是您想要的类,因为在CIL中,一切都很容易搞乱
这是一个示例,我只是将变体A从CA类型更改为CB类型,将股票实例CB从B更改为A(类似于您在中所做的)
@Asad-Correct可能重复,但不幸的是,该问题没有明确的答案。答案表明,强制转换(因此强制转换操作码)是不必要的。@Asad-再次正确,但我没有明确的答案。您生成的IL无效。您可能是正在运行此操作的计算机上的管理员,因此它会跳过对您生成的IL的验证,但是如果您在其上运行
peverify
,您会发现您发出的IL已损坏。
.method public static void Swap(class TestOOP.Module1/CA& A,
class TestOOP.Module1/CB& B) cil managed
{
.maxstack 2
ldarg.0
ldarg.1
ldind.ref
stind.ref
ret
}