Why is this an issue?

When the same code is duplicated in two or more separate branches of a conditional, it can make the code harder to understand, maintain, and can potentially introduce bugs if one instance of the code is changed but others are not.

Having two Cases in the same Select statement or branches in the same If structure with the same implementation is at best duplicate code, and at worst a coding error.

If a >= 0 AndAlso a < 10 Then
  DoFirst()
  DoTheThing()
ElseIf a >= 10 AndAlso a < 20 Then
  DoTheOtherThing()
ElseIf a >= 20 AndAlso a < 50   ' Noncompliant; duplicates first condition
  DoFirst()
  DoTheThing()
Else
  DoTheRest();
End If
Select i
  Case 1
    DoFirst()
    DoSomething()
  Case 2
    DoSomethingDifferent()
  Case 3  ' Noncompliant; duplicates case 1's implementation
    DoFirst()
    DoSomething()
  Case Else:
    DoTheRest()
End Select

If the same logic is needed for both instances, then:

If (a >= 0 AndAlso a < 10) OrElse (a >= 20 AndAlso a < 50) Then
  DoFirst()
  DoTheThing()
ElseIf a >= 10 AndAlso a < 20 Then
  DoTheOtherThing()
Else
  DoTheRest();
End If
Select i
  Case 1, 3
    DoFirst()
    DoSomething()
  Case 2
    DoSomethingDifferent()
  Case Else:
    DoTheRest()
End Select

Exceptions

Blocks in an If chain or Case clause that contain a single line of code are ignored.

If a >= 0 AndAlso a < 10 Then
  DoTheThing()
ElseIf a >= 10 AndAlso a < 20 Then
  DoTheOtherThing()
ElseIf a >= 20 AndAlso a < 50   ' no issue, usually this is done on purpose to increase the readability
  DoTheThing()
End If

But this exception does not apply to If chains without Else-s, or to Select-s without Case Else clauses when all branches have the same single line of code. In the case of If chains with Else-s, or of Select-es with Case Else clauses, rule {rule:vbnet:S3923} raises a bug.

If a == 1 Then
  DoTheThing() ' Noncompliant, this might have been done on purpose but probably not
ElseIf a == 2 Then
  DoTheThing()
End If

Resources

Related rules