我有以下通过单元测试的方法;
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?
为什么会这样?
答案 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
所以:两件事之一:
第二种选择更为普遍。尝试恢复仅此方法更改,然后看问题是否消失。
如果是这样:Microsoft的人们将对复制感兴趣。