A continuación se muestra un accesorio de prueba simple. Tiene éxito en versiones de depuración y no en las versiones de lanzamiento (VS2010, .NET4 solución, x64):¿Puede el operador C# 'es' sufrir en optimización de modo de lanzamiento en .NET 4?
[TestFixture]
public sealed class Test
{
[Test]
public void TestChecker()
{
var checker = new Checker();
Assert.That(checker.IsDateTime(DateTime.Now), Is.True);
}
}
public class Checker
{
public bool IsDateTime(object o)
{
return o is DateTime;
}
}
Parece optimización de código da rienda suelta a algunos estragos; si lo desactivo en la compilación Release, también funciona. Eso fue bastante desconcertante para mí. A continuación, he utilizado ILDASM desmontar las 2 versiones de la construcción:
depuración IL:
.method public hidebysig instance bool IsDateTime(object o) cil managed
{
// Code size 15 (0xf)
.maxstack 2
.locals init (bool V_0)
IL_0000: nop
IL_0001: ldarg.1
IL_0002: isinst [mscorlib]System.DateTime
IL_0007: ldnull
IL_0008: cgt.un
IL_000a: stloc.0
IL_000b: br.s IL_000d
IL_000d: ldloc.0
IL_000e: ret
} // end of method Validator::IsValid
la liberación de IL:
.method public hidebysig instance bool IsDateTime(object o) cil managed
{
// Code size 10 (0xa)
.maxstack 8
IL_0000: ldarg.1
IL_0001: isinst [mscorlib]System.DateTime
IL_0006: ldnull
IL_0007: cgt.un
IL_0009: ret
} // end of method Validator::IsValid
Parece una tienda y la carga se optimiza de distancia. Apuntar a versiones anteriores del framework .NET hizo que el problema desapareciera, pero eso podría ser un golpe de suerte. Encontré este comportamiento algo desconcertante, ¿alguien puede explicar por qué el compilador pensaría que es seguro realizar una optimización que produzca un comportamiento diferente?
Gracias de antemano.
Donde hizo el El método 'IsValid' viene de? No estás mostrando eso en el código C#. –
Lo siento, he cambiado el nombre del método después de que se realizó el volcado de ILDASM; nombrando arreglado ahora. – Cumbayah
me huele a errores ... muy agradable de encontrar – sehe