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

Converting block body method with out parameter to expression body method causes out parameter to be null

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

    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);

失败的测试断言方法 returns 为真,并且为配置返回的实例不为空。我以为这些编译成完全相同的 IL?

为什么会这样?

它们在语义上是相同的,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 的人员会对复制感兴趣。