I learned something today (.NET and VB6)

J

Just_a_fan

As they say in South Park... "Well, I learned something today."

This is valid in both VB6 and 9 versions:

Select Case TrySelect
Case 1, 3
Debug.Print "1"
Case 2
Debug.Print "2"
Case 3
Debug.Print "3"
End Select

Of course, the "Case 3" never gets executed due to the "Case 1, 3"
catching the 3. I cannot imagine it is even legal to code but does not
even get a simple warning flag in VB9. Good languages will flag code
that cannot get executed. VB6 and 9 both ignore the situation.

Calling this with 1 then 2 then 3 prints 1 then 2 then 1 again.

I accidentally left a duplicate of a Case "test expression" in a program
I am working on. It was a leftover from a change I made some time back.
It had no code in it so I did not notice it until I was reworking the
routine a bit, yesterday. I was amazed that this is even allowed. It
is not allowed in at least one other language I have worked in, possibly
two others. What's the point?

Live and learn!

Mike
 
A

AMercer

Well, you have a point, I suppose. The existing behavior is documented, to
wit "If testexpression matches an expressionlist clause in more than one Case
clause, only the statements following the first match run."

Why is it this way? Maybe just sloppy work at MS, but a more interesting
explanation (I don't know if it is true or not) comes from the fact that in
"case xxx", xxx can be an variable (rather than just a constant as in C), eg

Dim i As Integer = 3
Dim j As Integer = 3
Select Case j
Case i : whatever
Case 3 : whatever
End Select

No diagnostic is possible at compile time. What do you want this construct
to do - throw an exception at runtime when i=3? There are two case clauses
that match the select clause, but only one will run. I don't think an
exception is useful, and I don't think you do either. Maybe VB allowing
expressions where C allows only constants explains VB's keep-it-simple
approach.

I'm not asserting that this explanation is the truth - it is just musings
that follow from your original post.
 
H

Herfried K. Wagner [MVP]

AMercer said:
Dim i As Integer = 3
Dim j As Integer = 3
Select Case j
Case i : whatever
Case 3 : whatever
End Select

No diagnostic is possible at compile time. What do you want this
construct
to do - throw an exception at runtime when i=3? There are two case
clauses
that match the select clause, but only one will run. I don't think an
exception is useful, and I don't think you do either. Maybe VB allowing
expressions where C allows only constants explains VB's keep-it-simple
approach.

I'd prefer an optional warning or rule which makes the developer aware that
he is writing useless code. However, even 'If False Then...' is permitted
by the compiler.
 
J

Just_a_fan

VERY interesting point. I have never even considered the possibility of
coding what you show here. I had no idea it was even legal. However,
it still has a problem. The second Case never runs as far as I can tell
just desk checking it. It is just the same as my original assertion.
You get non-executable code which is unflagged.

Mike
 
J

Just_a_fan

If False then ... INDEED!
End if

Well, one can shot oneself in the foot, if desired, I guess. I was just
wishing for a warning, at least, when you write something a little more
complex and then it might not run as you think or not run at all.

Thanks for the laugh!

Remember, Fornapulation is fun!

Mike
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Top