Czy ktoś mógłby mi wyjaśnić, dlaczego ten fragment kodu działa dobrze, gdy uruchamiam go na platformie x86 i dlaczego nie działa na x64?Zmienna nie jest inkrementująca w wydaniu C# x64
Wyniki:
- x86 Debug: 12345678910
- 64 Debug: 12345678910
- x86 wydania: 12345678910
- 64 Release: 1111111111
Gdybym coś zmienić, jak usuwanie jedną z nieużywanych zmiennych lub jeśli usunę niepotrzebną pętlę for po p_lFirstId ++, dziwne zachowanie zniknie.
Znalazłem, że zmiana "pdb-only" na "full" w mojej konfiguracji wydania, to znowu działa.
Jeśli uruchamiasz kod bezpośrednio ze studia graficznego, to też działa dobrze.
Czy jest to błąd kompilatora JIT?
Z góry dziękuję.
class Program
{
static void Main(string[] args)
{
Test(null, null, null, 0, 1);
}
public static void Test(
List<string> liste, List<string> unused1,
string unused2, int unused3, long p_lFirstId)
{
liste = new List<string>();
StringBuilder sbSql = new StringBuilder();
for (int i = 0 ; i < 10 ; i++)
{
sbSql.Append(p_lFirstId);
p_lFirstId++;
foreach (string sColonne in liste)
{
}
}
System.Console.WriteLine(sbSql.ToString());
}
}
Oczyść, a następnie przebuduj rozwiązanie, założę się z jakiegoś powodu, że gdzieś jest zawieszony na starej bibliotece DLL. – msarchet
Znalazłeś błąd optymalizatora JIT. Nie jestem blisko x64, żeby to sprawdzić. Opublikuj to w witrynie connect.microsoft.com, nie zapomnij o dokładnym udokumentowaniu używanej wersji .NET. W przeciwnym razie przypomina błąd w jitterze dla 3.5 (nie sp1). –
Co się stanie, jeśli zadeklarujesz lokalną kopię do modyfikacji zamiast modyfikować zmienną parametru? Myślę, że nie byłoby to rozstrzygające, ponieważ brzmi jak coś w rodzaju Hiesenbuga. – Rup