none
Неверно компилируется код в релизе. RRS feed

  • Вопрос

  • Работаю в Visual Studio 2013, Visual C# 2013.
    Цикл приложения всегда соскакиваеит в 'continue' в сборке Release
    и правильно работает (условие цикла проверяется слева направо) в Debug.

    Доколе ?!, хотел бы я спросить, неверно будет компилироваться код в релизе?

    public class A
    {
     List<string> sl;

     public A(){ sl = new List(); }
     public int size()
     {
      return sl.Count;
     }
     public int add(string str)
     {
      if(sl.Contains(str)) return sl.IndexOf(str);
      sl.add(str); return sl.Count - 1;
     }

    }

     a = new A();

     while(true)
     {

      //всегда 'continue' :

      if(a.size != a.add("some string")) continue;

      // так работает в релизе:
                    // int gar = a.size; if(gar != a.add("some string")) continue;
     }
    29 сентября 2015 г. 16:15

Ответы

  • Добиться описанного Вами поведения мне не удалось. Возможно, что, сокращая код для публикации, Вы также удалили кусок кода, который приводил к проблеме. Тот факт, что опубликованный Вами код содержит ошибки, говорит о том, что Вы его не компилировали и не проверяли, действительно ли он приводит к проблеме, о которой Вы говорите.
    • Помечено в качестве ответа ToylexNet 1 октября 2015 г. 6:55
    29 сентября 2015 г. 18:56

Все ответы

  • Приведите пожалуйста завершённый пример кода, который можно откомпилировать без исправления ошибок и дописывания недостающих частей.
    29 сентября 2015 г. 17:16
  • в моем случае класс A сложнее, но принцип тот-же

    единственное, что добавить могу, компиляция 64-х разрядная.

    описанный выше мною случай не отражает вопрос?

    29 сентября 2015 г. 18:34
  • Добиться описанного Вами поведения мне не удалось. Возможно, что, сокращая код для публикации, Вы также удалили кусок кода, который приводил к проблеме. Тот факт, что опубликованный Вами код содержит ошибки, говорит о том, что Вы его не компилировали и не проверяли, действительно ли он приводит к проблеме, о которой Вы говорите.
    • Помечено в качестве ответа ToylexNet 1 октября 2015 г. 6:55
    29 сентября 2015 г. 18:56
  • Из Вашего кода следует, что size - метод. Почему, в таком случае, Вы обращаетесь к нему как к полю или свойству? Где круглые скобки?

    Если сообщение помогло Вам, пожалуйста, не забудьте отметить его как ответ данной темы. Удачи в программировании!

    29 сентября 2015 г. 19:15
  • Вы правы, но в моем случае ошибка остается, а простой пример с ошибкой написать не удалось.

    Но все-равно странно, что надо сделать чтобы "if(a.size != a.add("some string")) continue;"

    перестало работать только в релизе.

    1 октября 2015 г. 6:55
  • Без возможности воспроизвести ошибку локально и проверить, что именно происходит, сказать трудно. Могу предположить такие варианты:
    1. Ошибка компилятора C#. Маловероятно. Компилятор от Microsoft излишней оптимизацией не балуется и генерирует весьма примитивный IL код, вычисляющий выражения с лева на право, как того требует спецификация. Легко проверить, проинспектировав IL код, генерируемый в режиме отладки и релиза.
    2. Ошибка JIT компилятора. Если бы JIT компилятор грешил излишней перестановкой инструкций, то это наверняка уже давно бы заметили. Или у Вас уж очень очень специфичный случай, который ни у кого другого не попадался.
    3. Ошибка где-то в Вашем коде. Например, отсутствие должной синхронизации при меж потоковом взаимодействии.
    1 октября 2015 г. 7:31