C &# 039#;,' operatör serbest bırakma modu optimizasyonu altında acı .NET 4?
Aşağıda basit bir test Fikstür. Ve Yayın yapılarında (VS2010, geliştirir .hata Ayıklama başarısız başarılı NET4 çözüm, x 64):
[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;
}
}
Kod optimizasyonu bazı hasara yol açtı gibi görünüyor; eğer Yayın yapıp devre dışı bırakırsam, iyi çalışır. Bu benim için oldukça şaşırtıcı oldu. Aşağıda, ILDASM yapı 2 sürümleri sökmek için kullandım:
IL hata ayıklama:
.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
Bırakın 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
Mağaza ve bir yük optimize edilmiş gibi görünüyor. Önceki sürümleri hedefleyen .NET çerçeve sorunu ortadan kaldırıyordu, ama bu sadece bir rastlantı olabilir. Bu davranışları biraz sinir bozucu buldum, kimseye derleyici düşünürdüm neden açıklayabilir güvenli farklı gözlemlenebilir davranış üreten bir optimizasyon yapmak için?
Şimdiden teşekkürler.
CEVAP
Bu hata zaten Jacob Stanley tarafından this SO question geldi. Jacob zaten reported the bug, ve Microsoft gerçekten CLR TAM zamanında bir hata olduğunu onaylamıştır. Microsoft şu açıklamayı yaptı:
Bu hata çalışma zamanı, bir sonraki sürümünde sabit olacaktır. Eğer bir hizmet paketi veya bir sonraki büyük sürüm olup olmadığını söylemek için çok erken korkuyorum.
Seni tekrar bu sorunu bildirdiği için teşekkür ederiz.
TestChecker()
aşağıdaki öznitelik ekleyerek hata, bir çözüm olabilir çocuğumun da tiyatroyu:
[MethodImpl(MethodImplOptions.NoInlining)]
Otomatik referans sayma altında, neden...
Android belirgin gelişme modu ve serbe...
Varlık içinde Operatör gibi Çerçeve?...
Kullanıcılar /yazılabilir dir güvensiz...
Üçlü operatör (?:) Bash...