将带out参数的块体方法转换为表达式体方法会导致out参数为空

时间:2019-06-14 14:59:52

标签: c# out-parameters expression-body

我有以下通过单元测试的方法;

    public static bool TryGetInstance<T>(out T config) where T : class
    {
        return Instance.TryGetInstance(out config);
    }

当我将其转换为表达式主体语法时,单元测试会失败吗?

    public static bool TryGetInstance<T>(out T config) where T : class => 
        Instance.TryGetInstance(out config);

失败的测试断言该方法返回true,并且为config返回的实例不为null。我以为它们编译成完全相同的IL?

为什么会这样?

1 个答案:

答案 0 :(得分:0)

它们在语义上是相同的,as shown here

IL相同:

    .method public hidebysig static 
        bool TryGetInstance1<class T> (
            [out] !!T& config
        ) cil managed 
    {
        // Method begins at RVA 0x2050
        // Code size 12 (0xc)
        .maxstack 8

        IL_0000: call class Foo P::get_Instance()
        IL_0005: ldarg.0
        IL_0006: callvirt instance bool Foo::TryGetInstance<!!T>(!!0&)
        IL_000b: ret
    } // end of method P::TryGetInstance1

    .method public hidebysig static 
        bool TryGetInstance2<class T> (
            [out] !!T& config
        ) cil managed 
    {
        // Method begins at RVA 0x205d
        // Code size 12 (0xc)
        .maxstack 8

        IL_0000: call class Foo P::get_Instance()
        IL_0005: ldarg.0
        IL_0006: callvirt instance bool Foo::TryGetInstance<!!T>(!!0&)
        IL_000b: ret
    } // end of method P::TryGetInstance2

所以:两件事之一:

  1. 您破坏了编译器或JIT
  2. 错误不在您认为的地方

第二种选择更为普遍。尝试恢复仅此方法更改,然后看问题是否消失。

如果是这样:Microsoft的人们将对复制感兴趣。