当我发现一些非常奇怪的行为时,我正在与奇妙的SharpLab.io玩耍,试图更好地理解c#降低。
我观察到下面这句话的降低
public class C {
bool a;
public void M()
{
a = a && false;
}
}似乎被降下到
public class C
{
private bool a;
public void M()
{
a = !a && false;
}
}a = !a && false;降低到a = a && false;
我的问题是
a && false降低到!a && false!a && false到a && false)false (我理解ref类型可以覆盖bool强制转换,但这只是内部构建的bool类型)(a = false && a,a = false && !a都正确地降低到a = false)
发布于 2022-02-28 22:01:26
由于M的结果总是==为假,所以无论你看到a还是!a,都不重要。当我看到vs2022的输出时,Il间谍也是这么说的
.class public auto ansi beforefieldinit C
extends [System.Runtime]System.Object
{
// Fields
.field private bool a
// Methods
.method public hidebysig
instance void M () cil managed
{
// Method begins at RVA 0x2050
// Code size 20 (0x14)
.maxstack 8
// {
IL_0000: nop
// a = !a && false;
IL_0001: ldarg.0
IL_0002: ldarg.0
IL_0003: ldfld bool C::a
IL_0008: brfalse.s IL_000d
IL_000a: ldc.i4.0
IL_000b: br.s IL_000e
IL_000d: ldc.i4.0
IL_000e: stfld bool C::a
// }
IL_0013: ret
} // end of method C::M
.method public hidebysig specialname rtspecialname
instance void .ctor () cil managed
{
// Method begins at RVA 0x2065
// Code size 8 (0x8)
.maxstack 8
// {
IL_0000: ldarg.0
// (no C# code)
IL_0001: call instance void [System.Runtime]System.Object::.ctor()
// }
IL_0006: nop
IL_0007: ret
} // end of method C::.ctor
} // end of class Chttps://stackoverflow.com/questions/71301428
复制相似问题