这是什么编译器生成的枚举意味着什么呢?
-
23-08-2019 - |
题
我写了一个相当复杂的方法,该方法的产量返回IEnumerable<string>
,但是当我在反射器检查编译器输出,我不理解IEnumerator
的编译器生成实施的特定部分:
void IDisposable.Dispose()
{
switch (this.<>1__state)
{
case 1:
case 2:
case 3:
switch (this.<>1__state) // empty switch! why?!
{
}
break;
default:
return;
try // What?! AFTER return?!
{
}
finally // is the try-finally block anyhow relevant?
{
this.<>m__Finallya();
}
break;
}
this.<>m__Finally7();
}
我猜测(或希望),该反射器放错地方的外switch
的右大括号,并且应该在return
后直接。不过,我不明白为什么会出现的情况下,3空值开关,或者为什么m__Finallya
被称为在finally
块。 (有没有正常运行之间和finally
块?比CER的,我不我的代码有其他内部语义差别。)
有关参考,这里是IL:
.method private hidebysig newslot virtual final
instance void System.IDisposable.Dispose() cil managed
{
.override [mscorlib]System.IDisposable::Dispose
// Code size 69 (0x45)
.maxstack 2
.locals init ([0] int32 CS$0$0000,
[1] int32 CS$0$0001)
IL_0000: ldarg.0
IL_0001: ldfld int32 FBD.TIP.Reader.MissingMessagesReader/'<GetMissingMessages>d__0'::'<>1__state'
IL_0006: stloc.0
IL_0007: ldloc.0
IL_0008: ldc.i4.1
IL_0009: sub
IL_000a: switch (
IL_001c,
IL_001c,
IL_001c)
IL_001b: ret
IL_001c: ldarg.0
IL_001d: ldfld int32 FBD.TIP.Reader.MissingMessagesReader/'<GetMissingMessages>d__0'::'<>1__state'
IL_0022: stloc.1
IL_0023: ldloc.1
IL_0024: ldc.i4.2
IL_0025: sub
IL_0026: switch (
IL_0035,
IL_0035)
IL_0033: br.s IL_003e
.try
{
IL_0035: leave.s IL_003e
} // end .try
finally
{
IL_0037: ldarg.0
IL_0038: call instance void FBD.TIP.Reader.MissingMessagesReader/'<GetMissingMessages>d__0'::'<>m__Finallya'()
IL_003d: endfinally
} // end handler
IL_003e: ldarg.0
IL_003f: call instance void FBD.TIP.Reader.MissingMessagesReader/'<GetMissingMessages>d__0'::'<>m__Finally7'()
IL_0044: ret
} // end of method '<GetMissingMessages>d__0'::System.IDisposable.Dispose
解决方案
这简单地反射器挣扎跟上已产生(因为迭代块不必涉及到“正常” C#,只要它们是有效的IL)的IL。特别地,该ret
是finally
块之后。
其他提示
您还没有表现出你原来的迭代器块看起来像什么,但我的反射和编译器生成的代码的经验是,它并不总是设法完全准确的编译,因为编译器使用了一些IL不具有在C#的等效。
我可以说,C#编译器是愚蠢的,(它可能是一个有点傻)。它也很可能是当运行时(所有讨厌的垃圾被省略)。
即时编译的代码看起来非常不同总之,你也许熟悉状态机?当你写在C#(产量东西)发电机你告诉编译器发射将实现该发生器的状态机匿名类型。这是一个很好的正规的方法这是为了可核查的。这可能是原因,它看起来它的方式。
不隶属于 StackOverflow