Ci-dessous est un simple montage de test. Il réussit dans les versions de Débogage et échoue dans les versions Release (VS2010, .NET4 solution, x64):
[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;
}
}
Il semble d'optimisation de code fait quelques ravages; si je le désactiver sur la Version de publication, il fonctionne aussi bien. C'était assez déroutant pour moi. Ci-dessous, j'ai utilisé ILDASM de démonter les 2 versions du build:
Debug 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 libération de l'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
Il semble un magasin et de la charge est optimisé loin. Le ciblage des versions antérieures de l' .NET framework est le problème de s'en aller, mais c'est peut être juste un coup de chance. Je trouve ce comportement un peu énervant, quelqu'un peut-il expliquer pourquoi le compilateur pense qu'il est prudent de faire une optimisation qui produit différents comportements observables?
Merci à l'avance.