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 the same logic is truly needed for both instances, then in an ``++If++`` structure they should be combined, or for a ``++Select++``, one should fall through to the other.

== Noncompliant Code Example

----
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 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
----

== 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 case of ``++If++`` chains with ``++Else++``-s, or of ``++Select++``-es with ``++Case Else++`` clauses, rule S3923 raises a bug. 


----
If a >= 0 AndAlso a < 10 Then
  DoTheThing()
ElseIf a >= 10 AndAlso a < 20 Then
  DoTheOtherThing()  ' Noncompliant, this might have been done on purpose but probably not
End If
----

ifdef::env-github,rspecator-view[]
'''
== Comments And Links
(visible only on this page)

include::../comments-and-links.adoc[]
endif::env-github,rspecator-view[]
