C# Castclass操作码是必需的吗?

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

CLR允许我使用对象引用设置字段,而不管是否执行了
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
}