Может кто-нибудь объяснить мне, почему приведенный ниже код действителен в C # и выполняет вызов Console.WriteLine
?
using (null)
{
Console.WriteLine ("something is here")
}
Он компилируется в (в конце показан блок).Как видите, компилятор решает не выполнять метод Dispose()
и переходит к инструкции endfinally
.
IL_0013: ldnull
IL_0014: ceq
IL_0016: stloc.1
IL_0017: ldloc.1
IL_0018: brtrue.s IL_0021 // branches here and decide not to execute Dispose()
IL_001a: ldnull
IL_001b: callvirt instance void [mscorlib]System.IDisposable::Dispose()
IL_0020: nop
IL_0021: endfinally
Однако, если я запускаю следующий код, произойдет сбой с NullReferenceException
(что ожидается):
((IDisposable)null).Dispose();
IL_0023: ldnull
IL_0024: callvirt instance void [mscorlib]System.IDisposable::Dispose()
Почему компилируется первая версия?Почему компилятор решает не выполнять Dispose()
?Есть ли другие случаи, когда компилятор может решить не вызывать Dispose()
в блоке using
?