2013-06-07 2 views
4

У меня есть часть кода vb.net, которую я написал. Это цикл for с двумя встроенными операциями if, и компилятор сообщает мне, что каждому elseif и endif должно предшествовать сопоставление if.Endif должно предшествовать сопоставлению, если

Это мой второй день работы с vb.net, и единственный опыт программирования, который у меня есть, - это писать файлы .bat, так что это может быть что-то действительно глупое. Но я не могу понять, почему я получаю эти ошибки, и если вы все захотите помочь мне, я был бы очень признателен!

For Each computer In compArray 
     If compArray(I) <> Computers.GetKey(I) Then notpresentList.Add(Computers.GetKey(I)) 
Else 
     If Computers.GetByIndex(I) = 0 Then disabledList.Add(Computers.GetKey(I)) 
     Elseif Computers.GetByIndex(I)=1 Then enabledList.Add(Computers.GetKey(I)) 
     Elseif Computers.GetByIndex(I)=2 Then unknownList.Add(Computers.GetKey(I)) 
    End if 
    End if 
     I += 1 
    Next 

Контекст для этого: Я пытаюсь написать фрагмент кода, который подтвердит наличие битблока. Я написал в VBScript что-то, что будет проверять, включен ли битлокатор, а затем отправить электронное письмо. Этот фрагмент кода является частью программы, которая будет извлекать эти электронные письма, сравнивать их со списком компьютеров, а затем создавать дайджест-электронную почту, в которой указывается, какие компьютеры отсутствуют, включить или отключить битлокатор или в неизвестном состоянии.

Я уверен, что есть еще один и лучший способ сделать это, но, как я уже сказал, я довольно новичок в этом вопросе, и нам нужно сделать это по юридическим причинам.

Еще раз спасибо!

EDIT: Если вам нужна дополнительная информация, пожалуйста, спрашивайте меня!

+0

Что данные тип компьютеров? –

+0

Компьютеры - это отсортированный список. – Wolves

+0

Оказывается, это было что-то глупое :) Я очень ценю тот факт, что вы все были так полезны! Спасибо вам всем! – Wolves

ответ

4

Я бы использовал встроенный синтаксис в VB.NET только с короткими и простыми условиями. В противном случае код становится менее читаемым и более подверженным ошибкам.

Попробуйте это:

For Each computer In compArray 
    If compArray(i) <> Computers.GetKey(i) Then 
     notpresentList.Add(Computers.GetKey(i)) 
    Else 
     Dim comp = Computers.GetByIndex(i) 
     If comp = 0 Then 
      disabledList.Add(Computers.GetKey(i)) 
     ElseIf comp = 1 Then 
      enabledList.Add(Computers.GetKey(i)) 
     ElseIf comp = 2 Then 
      unknownList.Add(Computers.GetKey(i)) 
     Else ' added this to show you that this case is not covered yet 
      Throw New NotSupportedException 
     End If 
    End If 
    i += 1 
Next 
+4

Это нормально использовать встроенный sytnax, но только для коротких простых утверждений. Этот блок не является ни коротким, ни простым :) –

+0

@JoelCoehoorn: Я согласен. Отредактировал мой ответ. –

4

Ваши If…Then линии должны быть разбиты. Переместите все после Then на следующие строки, и вы должны быть хорошими.

If compArray(I) <> Computers.GetKey(I) Then notpresentList.Add(Computers.GetKey(I)) 

If…Then заявление на одной линии самодостаточно, не следует с завершающим End If, и не может использовать ElseIf.

2

Ваша путаница в синтаксисе VB.NET для If заявлений. VB.NET допускает два разных формата, каждый из которых имеет разные синтаксические правила: однострочные If операторы и многострочные блоки If.

однострочный If заявление выглядит следующим образом (обратите внимание, что нет End If):

If x Then y = 1 

многострочный If блок выглядит следующим образом:

If x Then 
    y = 1 
End If 

Когда вы кладете код в той же строке, после Then, предполагается, что вы намереваетесь использовать однострочный оператор If. Однолинейные If заявления не могут включать ElseIf, а также Else условиях. Их можно использовать только для простых условий.Поэтому, чтобы сделать ваш код работать должным образом, вам нужно отформатировать его как многострочно If блок, поставив условный код на следующей строке, например:

For Each computer In compArray 
    If compArray(I) <> Computers.GetKey(I) Then 
     notpresentList.Add(Computers.GetKey(I)) 
    Else 
     If Computers.GetByIndex(I) = 0 Then 
      disabledList.Add(Computers.GetKey(I)) 
     Elseif Computers.GetByIndex(I)=1 Then 
      enabledList.Add(Computers.GetKey(I)) 
     Elseif Computers.GetByIndex(I)=2 Then 
      unknownList.Add(Computers.GetKey(I)) 
     End if 
    End if 
    I += 1 
Next 

Для получения дополнительной информации о синтаксисе, возьмите посмотрите на странице MSDN в инструкции If.

+1

Спасибо! Я не понимал, что синтаксис изменится с форматированием. – Wolves

1

ОДНОЛИНЕЙНАЯ If «s все должны начать только с If:

т.е.

If Computers.GetByIndex(I) = 0 Then disabledList.Add(Computers.GetKey(I)) 
If Computers.GetByIndex(I) = 1 Then enabledList.Add(Computers.GetKey(I)) 
If Computers.GetByIndex(I) = 2 Then unknownList.Add(Computers.GetKey(I)) 

Вы также можете использовать Select Case, чтобы сделать его более удобным для чтения, т.е.

Select Case Computers.GetByIndex(I) 

Case 0 
    disabledList.Add(Computers.GetKey(I)) 
Case 1 
    enabledList.Add(Computers.GetKey(I)) 
Case 2 
    unknownList.Add(Computers.GetKey(I)) 
Case Else 
' Some sort of default action can go here, useful for error catching/prevention 
End Select 
Смежные вопросы