I learned something today (.NET and VB6)

Collapse
This topic is closed.
X
X
 
  • Time
  • Show
Clear All
new posts
  • Just_a_fan@home.net

    I learned something today (.NET and VB6)

    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

  • Herfried K. Wagner [MVP]

    #2
    Re: I learned something today (.NET and VB6)

    "AMercer" <AMercer@discus sions.microsoft .comschrieb:
    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.


    --
    M S Herfried K. Wagner
    M V P <URL:http://dotnet.mvps.org/>
    V B <URL:http://dotnet.mvps.org/dotnet/faqs/>

    Comment

    • Just_a_fan@home.net

      #3
      Re: Re: I learned something today (.NET and VB6)

      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

      On Fri, 11 Apr 2008 01:39:12 +0200, in
      microsoft.publi c.dotnet.langua ges.vb "Herfried K. Wagner [MVP]"
      <hirf-spam-me-here@gmx.atwrot e:
      >"AMercer" <AMercer@discus sions.microsoft .comschrieb:
      > 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.

      Comment

      Working...