2012-03-22 2 views
0

Я просто слепой или это заявление if действительно не делает то, что он предназначен?Операция «Если» не возвращает то, что она предназначена для

Dim textSample as String = "F" 
If Not textSample = "D" Or Not textSample = "E" Or Not textSample = "F" Then 
    MessageBox.Show("False") 
End If 

Это отображает окно сообщения, хотя textSample является одной из букв. В моих глазах, что оператор if должен видеть, что textSample является одной из этих букв и пропускает его, тогда как если бы это был Z, он был бы «не» равным любому из них и поэтому показывал бы окно сообщения.

Почему он входит в заявление if?

+1

Чтобы помочь себе лучше понять, вы можете (почему ответ Роберта и мой на самом деле одинаковы) (http://en.wikipedia.org/wiki/De_Morgan%27s_laws). –

ответ

5

cond1 Or cond2 Or ... Or condn истинно тогда и только тогда, когда верно хотя бы одно из данных условий. В вашем случае всегда бывает, что хотя бы одно из условий истинно (фактически, по крайней мере два из условий будут истинны в каждом случае). Например, если textSample равно "D", тогда будет выполнено условие Not textSample = "E" и условие Not textSample = "F". Таким образом, все условие будет истинным.

Краткая история: используйте И вместо Ор.

2

Нет значения textSample, для которого ваше условие if может быть ложным. Я думаю, что вы хотите вместо этого:

If Not (textSample = "D" Or textSample = "E" Or textSample = "F") Then 
    MessageBox.Show("False") 

Если вы не видите разницы, рассмотрим the truth tables for both versions.

2

Это потому, что вы используете предложение OR, вам нужно использовать AND. В основном, вы говорите, если textSample не D, тогда покажите свое окно сообщения.

Изменить его:

Dim textSample as String = "F" 
If Not textSample = "D" AND Not textSample = "E" AND Not textSample = "F" Then 
    MessageBox.Show("False") 
End If 

Это должно работать.

3

Он действует нормально. True Or True Or False = True

Я считаю, что вы хотите

Dim tBadLetters() As String = {"D", "E", "F"} 

If Not tBadLetters.COntains(txtSample) 
    MsgBox("blah") 
End If 
0

сообщение будет всегда показывать. Вот почему. В вашем примере скажем textSample = "F". Тогда

if Not F equals D Or Not F equals E or Not F equals F 

Итак, давайте подведем итоги:

if (F not equals D) or (F not equals E) or (F not equals F) 

... если (истина) или (истина) или (ложь)

Так что ваше состояние не является истинным, независимо от того, что textSample является ... (за исключением того, что ваш текстовый образец может быть равным равным «D» и равен «E» и равен «F»).

Я думаю, вы хотите изменить «или» на «и».

0

Я бы лично писать так:

Dim textSample As String = "F" 

If textSample <> "D" AndAlso textSample <> "E" AndAlso textSample <> "F" Then 
    MessageBox.Show("False") 
End If 

Если вы, как и я, хотел использовать chainability из.NET, я также написал для себя несколько строковых расширений для случаев, как это:

Public Module StringExtensions 

    <Extension()> _ 
    Public Function IsNullOrBlank(ByVal s As String) As Boolean 
     Return s Is Nothing OrElse s.Trim.Length.Equals(0) 
    End Function 

    <Extension()> _ 
    Public Function IsNotNullOrBlank(ByVal s As String) As Boolean 
     Return s IsNot Nothing AndAlso s.Trim.Length > 0 
    End Function 

    <Extension()> _ 
    Public Function IsEqualToAny(ByVal s As String, ByVal ParamArray values As String()) As Boolean 
     If s.IsNotNullOrBlank AndAlso values.Length > 0 Then 
      For Each value As String In values 
       If s = value Then Return True 
      Next 
     End If 

     Return False 
    End Function 

    <Extension()> _ 
    Public Function IsNotEqualToAny(ByVal s As String, ByVal ParamArray values As String()) As Boolean 
     If s.IsNotNullOrBlank AndAlso values.Length > 0 Then 
      For Each value As String In values 
       If s = value Then Return False 
      Next 
     End If 

     Return True 
    End Function 

End Module 

, где я мог бы написать свой Если заявление так:

Dim textSample As String = "F" 

If textSample.IsNotEqualToAny("D", "E", "F") Then 
    MessageBox.Show("False") 
End If 
Смежные вопросы