Как указать отрицательный шаг для целочисленного индекса без знака в цикле for VB.net

Как указать отрицательный шаг для целочисленного индекса без знака для цикла for в VB.net

Следующий код не будет компилироваться:

Option Strict

For i as uLong = uLong.maxvalue To 0 Step -1UL
  ...
next i

Выдает это: Ошибка: BC30439 Постоянное выражение не может быть представлено в типе 'ULong'


person Charles Okwuagwu    schedule 10.11.2015    source источник
comment
Синтаксис, которому вы следовали, правильный, и я не нашел никакой ошибки, и даже я попробовал тот же код, и он работает нормально.   -  person Ramesh Babu    schedule 10.11.2015
comment
не компилируется в OPTION STRICT   -  person Charles Okwuagwu    schedule 10.11.2015
comment
Он успешно скомпилирован для меня с параметром strict on   -  person Ramesh Babu    schedule 12.11.2015
comment
только в том случае, если у вас также включена функция «Удалить проверки переполнения целых чисел»   -  person Charles Okwuagwu    schedule 12.11.2015


Ответы (2)


Неподписанный Int16/Int32/Int64 не может быть представлен как отрицательное значение, это невозможно сделать, см. ULong.MinValue.

Здесь у вас есть два варианта:

    1. Смоделируйте отрицательный шаг, используя цикл while/until:

      Dim i As ULong = ULong.MaxValue
      
      While (i <> ULong.MinValue)
          Console.WriteLine(i)
          i -= 1UL ' Decrement current value by desired amount.
      End While
      
    1. Установите /removeintchecks параметр компилятора vb, то вы можете использовать отрицательные значения для беззнаковых типов данных.

      Обратите внимание, что вы можете настроить этот параметр пошагово на странице конфигурации решения, в разделе «Дополнительные параметры компиляции» установите флажок «Удалить проверки целочисленного переполнения».

person ElektroStudios    schedule 10.11.2015
comment
я прибегнул к циклу while - person Charles Okwuagwu; 10.11.2015
comment
но если обход цикла for в обратном направлении является законной операцией, то не должен ли компилятор делать это в стороне или рассматривать это как особый случай? - person Charles Okwuagwu; 10.11.2015

Или вы можете попробовать это ..

Dim a As Integer = -1
For i As ULong = ULong.MaxValue To 0 Step CULng(a)

Next i
person David Wilson    schedule 10.11.2015
comment
не должен компилироваться - person Charles Okwuagwu; 10.11.2015
comment
ага :) -1 без подписи? компилируется, но не работает с переполнением‹bang_head_against_wall› - person David Wilson; 10.11.2015
comment
плюс один за старание бро :) - person Charles Okwuagwu; 10.11.2015