Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/308.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/css/38.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 我是否需要在ldloca和call之前将initobj/null赋值给out参数?_C#_Reflection.emit_Il - Fatal编程技术网

C# 我是否需要在ldloca和call之前将initobj/null赋值给out参数?

C# 我是否需要在ldloca和call之前将initobj/null赋值给out参数?,c#,reflection.emit,il,C#,Reflection.emit,Il,正如我看到的,C#compiler和Reflection.Emit总是为值和引用类型变量发出.locals init(即使它们后来被无条件初始化)。因此,它们可以作为out参数传递: .maxstack 1 .locals init ( [0] object x) L_0000: ldloca.s x L_0002: call void Program::MethodWithOut(object&) L_0007: ret 是否

正如我看到的,C#compiler和
Reflection.Emit
总是为值和引用类型变量发出
.locals init
(即使它们后来被无条件初始化)。因此,它们可以作为out参数传递:

    .maxstack 1
    .locals init (
        [0] object x)
    L_0000: ldloca.s x
    L_0002: call void Program::MethodWithOut(object&)
    L_0007: ret 

是否存在使用
.locals
而不使用
init
的情况,因此在发出call/callvirt之前,我需要确保变量已初始化?

当您通过
ref
传递参数时,需要在传递之前对其进行初始化。
当您通过
out
传递参数时,必须在被调用的方法内部初始化参数。

简单的答案是,始终需要
init
才能使代码可验证。根据§III.1.8.1.1验证算法:

此外,可验证方法应设置localsinit位[…]。如果未设置此位,则CLI可能会引发 验证 在访问局部变量的任何点以及程序集 未授予包含该方法的
SecurityPermission.SkipVerification


是的,我知道。我在问有关IL汇编规则的问题。很抱歉让人困惑,请参阅更新的问题。