Да, ваше выражение смертельно смущает оптимизатор JIT. Сгенерированный машинный код выглядит так:
if ((value == null || value == new string[0]) == false)
00000027 test esi,esi ; value == null?
00000029 je 00000075
0000002b xor edx,edx ; new string[0]
0000002d mov ecx,6D913BD2h
00000032 call FFD20BC8
00000037 cmp eax,esi ; (value == new string[0]) == false?
00000039 je 00000075
{
Console.WriteLine("Post-check Value is: " + value);
0000003b mov ecx,dword ptr ds:[03532090h] ; "Post-check value is: "
00000041 xor edx,edx ; BUGBUG not null!
00000043 call 6D70B7E8 ; String.Concat()
00000048 mov esi,eax ;
0000004a call 6D72BE08 ; get Console.Out
0000004f mov ecx,eax
00000051 mov edx,esi
00000053 mov eax,dword ptr [ecx]
00000055 call dword ptr [eax+000000D8h] ; Console.WriteLine()
Ошибка возникает по адресу 41, оптимизатор пришел к выводу, что значение всегда будет нулевым, поэтому он напрямую передает ноль в String.Concat ().
Для сравнения, это код, который генерируется при выключенной оптимизации JIT:
Console.WriteLine("Post-check Value is: " + value);
00000056 mov ecx,dword ptr ds:[03342090h]
0000005c mov edx,dword ptr [ebp-8]
0000005f call 6D77B790
Код был перемещен, но обратите внимание, что по адресу 5c он теперь использует локальную переменную (значение) вместо нуля.
Вы можете сообщить об этой ошибке на connect.microsoft.com. Обходной путь прост:
if (value != null)
{
Console.WriteLine("Post-check Value is: " + value);
new PrintManager().Print("blah", value);
}