Почему использование (null) допустимого регистра в C #?

Кто-нибудь, пожалуйста, объясните мне, почему показанный ниже код действителен на C # и выполняет вызов to Console.WriteLine ?

using (null) 
{
   Console.WriteLine ("something is here")
}

Он компилируется в (показан блок finally). Как вы можете видеть, компилятор решает не выполнять метод 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 () в с использованием блока ?

10
задан Cody Gray 4 March 2011 в 08:49
поделиться