Утверждение «если» не возвращает того, для чего предназначено - PullRequest
0 голосов
/ 22 марта 2012

Я просто слепой или это 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, он был бы "Not" равным любому из них и поэтому отображал бы окно сообщения.

Почему оно входит в оператор if?

Ответы [ 6 ]

5 голосов
/ 23 марта 2012

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

Короче говоря: используйте И вместо И.

3 голосов
/ 23 марта 2012

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

Я верю, что вы хотите

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

If Not tBadLetters.COntains(txtSample)
  MsgBox("blah")
End If
2 голосов
/ 23 марта 2012

Это потому, что вы используете оператор 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

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

2 голосов
/ 23 марта 2012

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

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

Если вы не видите разницу, изучите таблицы истинности для обеих версий .

0 голосов
/ 23 марта 2012

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

Dim textSample As String = "F"

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

Если вам, как и мне, нравится использовать возможность объединения .NET, я также написал для себя несколько String Extensions для таких случаев:

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

В то место, где я мог бы написать ваше заявление If следующим образом:

Dim textSample As String = "F"

If textSample.IsNotEqualToAny("D", "E", "F") Then
   MessageBox.Show("False")
End If
0 голосов
/ 23 марта 2012

Сообщение будет отображаться всегда.Вот почему.В вашем примере, скажем, 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)

... if (true) или (true) или (false)

Итак, ваше условие вернонезависимо от того, что textSample является ... (за исключением того, что ваш textSample может быть при том же быть равным "D" и равным "E" и равным "F").

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

...