Encontré un error en el código que solo se reproduce cuando el código se genera con las optimizaciones habilitadas. He creado una aplicación de consola que replica la lógica para probar (código a continuación). Vas a ver que cuando se habilita la optimización de 'valor' se convierte en nula después de la ejecución de esta lógica no válida:Error que solo se produce cuando la optimización de compilación se habilitó
if ((value == null || value == new string[0]) == false)
El arreglo es sencillo y se comenta a continuación el código erróneo. Pero ... me preocupa más que haya encontrado un error en el ensamblador o que alguien más tenga una explicación de por qué el valor se establece en nulo.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace memory_testing
{
class Program
{
sta tic void Main(string[] args)
{
while(true)
{
Console.Write("Press any key to start...");
Console.ReadKey();
Console.WriteLine();
PrintManagerUser c = new PrintManagerUser();
c.MyProperty = new string[1];
}
}
}
public class PrintManager
{
public void Print(string key, object value)
{
Console.WriteLine("Key is: " + key);
Console.WriteLine("Value is: " + value);
}
}
public class PrintManagerUser
{
public string[] MyProperty
{
get { return new string[100]; }
set
{
Console.WriteLine("Pre-check Value is: " + value);
if ((value == null || value == new string[0]) == false)
{
Console.WriteLine("Post-check Value is: " + value);
new PrintManager().Print("blah", value);
}
//if (value != null && value.Length > 0)
//{
// new PrintManager().Print("blah", value);
//}
}
}
}
}
La salida normal debe ser:
Pre-check Value is: System.String[]
Post-check Value is: System.String[]
Key is: blah
Value is: System.String[]
La salida buggy es:
Pre-check Value is: System.String[]
Post-check Value is:
Key is: blah
Value is:
Mi Env es una máquina virtual que ejecuta Windows Server 2003 R2 con .NET 3.5 SP1 . Usando el sistema de equipo VS2008.
Gracias,
Brian
Claramente, el optimizador está enojado con usted por usar '== falso' en lugar de aplicar el! operador a la expresión. – iandisme
Ooh, that * is * interesting. Entrando en el reflector ... –
Haha –
bmancini