将带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
所以:两件事之一:
- 你破坏了编译器或 JIT
- 错误并不在您认为的地方
第二种选择更为常见。尝试还原仅此方法更改,看看问题是否消失。
如果是这样:Microsoft 的人员会对复制感兴趣。
我有以下方法,已通过单元测试;
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
所以:两件事之一:
- 你破坏了编译器或 JIT
- 错误并不在您认为的地方
第二种选择更为常见。尝试还原仅此方法更改,看看问题是否消失。
如果是这样:Microsoft 的人员会对复制感兴趣。