Skip to content
  • Categories
  • Recent
  • Tags
  • Popular
  • World
  • Users
  • Groups
Skins
  • Light
  • Cerulean
  • Cosmo
  • Flatly
  • Journal
  • Litera
  • Lumen
  • Lux
  • Materia
  • Minty
  • Morph
  • Pulse
  • Sandstone
  • Simplex
  • Sketchy
  • Spacelab
  • United
  • Yeti
  • Zephyr
  • Dark
  • Cyborg
  • Darkly
  • Quartz
  • Slate
  • Solar
  • Superhero
  • Vapor

  • Default (No Skin)
  • No Skin
Collapse
Code Project
  1. Home
  2. General Programming
  3. C#
  4. Cannot implicitly convert type 'object' to 'bool'

Cannot implicitly convert type 'object' to 'bool'

Scheduled Pinned Locked Moved C#
helpquestion
42 Posts 17 Posters 2 Views 1 Watching
  • Oldest to Newest
  • Newest to Oldest
  • Most Votes
Reply
  • Reply as topic
Log in to reply
This topic has been deleted. Only users with topic management privileges can see it.
  • T Offline
    T Offline
    Tichaona J
    wrote on last edited by
    #1

    I keep getting the below error message when I try and run my code. Error 3 Cannot implicitly convert type 'object' to 'bool'. An explicit conversion exists (are you missing a cast?) When I try run the below code: private void Pause_Click(object sender, RoutedEventArgs e) { if (btnPause.Content = "Pause") <<<<

    L L O P C 9 Replies Last reply
    0
    • T Tichaona J

      I keep getting the below error message when I try and run my code. Error 3 Cannot implicitly convert type 'object' to 'bool'. An explicit conversion exists (are you missing a cast?) When I try run the below code: private void Pause_Click(object sender, RoutedEventArgs e) { if (btnPause.Content = "Pause") <<<<

      L Offline
      L Offline
      Luc Pattyn
      wrote on last edited by
      #2

      == :)

      Luc Pattyn [Forum Guidelines] [Why QA sucks] [My Articles] Nil Volentibus Arduum

      Please use <PRE> tags for code snippets, they preserve indentation, and improve readability.

      1 Reply Last reply
      0
      • T Tichaona J

        I keep getting the below error message when I try and run my code. Error 3 Cannot implicitly convert type 'object' to 'bool'. An explicit conversion exists (are you missing a cast?) When I try run the below code: private void Pause_Click(object sender, RoutedEventArgs e) { if (btnPause.Content = "Pause") <<<<

        L Offline
        L Offline
        Lost User
        wrote on last edited by
        #3

        Instead of coding:

        if (btnPause.Content == "Pause")

        try writing it this way round

        if ("Pause" == btnPause.Content)

        then when you inadvertently miss one of the = signs the compiler will give you a much more useful message.

        It's time for a new signature.

        L K P J S 5 Replies Last reply
        0
        • L Lost User

          Instead of coding:

          if (btnPause.Content == "Pause")

          try writing it this way round

          if ("Pause" == btnPause.Content)

          then when you inadvertently miss one of the = signs the compiler will give you a much more useful message.

          It's time for a new signature.

          L Offline
          L Offline
          Lost User
          wrote on last edited by
          #4

          Richard MacCutchan wrote:

          the compiler will give you a much more useful message.

          I don't know about that, you'd get "The left-hand side of an assignment must be a variable, property or indexer", which is true of course but it tells you to fix the wrong thing, it's saying that you should change the LHS into a variable. It's also saying that it's an assignment, but that just adds to the confusion because "there is no assignment, so the error makes no sense". OTOH, the "Cannot implicitly convert [type] to bool" is entirely clear, and since it's pointing to an expression in an if it tells you "you stuck something into an if that is not a bool" which is exactly what the problem is. Or maybe I'm just used to that kind of error.. edit: I did not vote "bad answer" by the way, so don't get mad at me please :)

          modified on Saturday, August 7, 2010 10:34 AM

          L 1 Reply Last reply
          0
          • L Lost User

            Richard MacCutchan wrote:

            the compiler will give you a much more useful message.

            I don't know about that, you'd get "The left-hand side of an assignment must be a variable, property or indexer", which is true of course but it tells you to fix the wrong thing, it's saying that you should change the LHS into a variable. It's also saying that it's an assignment, but that just adds to the confusion because "there is no assignment, so the error makes no sense". OTOH, the "Cannot implicitly convert [type] to bool" is entirely clear, and since it's pointing to an expression in an if it tells you "you stuck something into an if that is not a bool" which is exactly what the problem is. Or maybe I'm just used to that kind of error.. edit: I did not vote "bad answer" by the way, so don't get mad at me please :)

            modified on Saturday, August 7, 2010 10:34 AM

            L Offline
            L Offline
            Luc Pattyn
            wrote on last edited by
            #5

            it really should say

            if() expects a boolean and "btnPause.Content" isn't a boolean nor convertible to one

            and it could add

            there is an assignment in your expression; did you intend to test for equality? if so use ==

            Why can't error messages be very specific, after all the parser is specific when it checks things.

            harold aptroot wrote:

            I did not vote "bad answer"

            Neither did I, although I didn't like it much; the user should not change his habits just because the compiler lacks proper error reporting. The suggestion may be OK for C/C++, but doesn't help much for C# code. :)

            Luc Pattyn [Forum Guidelines] [Why QA sucks] [My Articles] Nil Volentibus Arduum

            Please use <PRE> tags for code snippets, they preserve indentation, and improve readability.

            modified on Saturday, August 7, 2010 10:51 AM

            L T 2 Replies Last reply
            0
            • L Lost User

              Instead of coding:

              if (btnPause.Content == "Pause")

              try writing it this way round

              if ("Pause" == btnPause.Content)

              then when you inadvertently miss one of the = signs the compiler will give you a much more useful message.

              It's time for a new signature.

              K Offline
              K Offline
              Keith Barrow
              wrote on last edited by
              #6

              I don't like this way of working personally, I think the semantics are less clear and it always feels like cutting the suit to match the cloth to me. I vaguely remember it was a good idea to use the 2nd form in C++, the compiler wouldn't throw an error otherwise, and would happily set btnPause.Content to "Pause" I haven't voted (and won't :-) ) vote on your response - I don't think there is anything wrong with what you said, it is just a different opinion about how to work.

              ragnaroknrol The Internet is For Porn[^]
              Pete o'Hanlon: If it wasn't insulting tools, I'd say you were dumber than a bag of spanners.

              L 1 Reply Last reply
              0
              • L Luc Pattyn

                it really should say

                if() expects a boolean and "btnPause.Content" isn't a boolean nor convertible to one

                and it could add

                there is an assignment in your expression; did you intend to test for equality? if so use ==

                Why can't error messages be very specific, after all the parser is specific when it checks things.

                harold aptroot wrote:

                I did not vote "bad answer"

                Neither did I, although I didn't like it much; the user should not change his habits just because the compiler lacks proper error reporting. The suggestion may be OK for C/C++, but doesn't help much for C# code. :)

                Luc Pattyn [Forum Guidelines] [Why QA sucks] [My Articles] Nil Volentibus Arduum

                Please use <PRE> tags for code snippets, they preserve indentation, and improve readability.

                modified on Saturday, August 7, 2010 10:51 AM

                L Offline
                L Offline
                Lost User
                wrote on last edited by
                #7

                :(( suitably chastised ...

                It's time for a new signature.

                L A 2 Replies Last reply
                0
                • L Lost User

                  :(( suitably chastised ...

                  It's time for a new signature.

                  L Offline
                  L Offline
                  Luc Pattyn
                  wrote on last edited by
                  #8

                  :beer:

                  Luc Pattyn [Forum Guidelines] [Why QA sucks] [My Articles] Nil Volentibus Arduum

                  Please use <PRE> tags for code snippets, they preserve indentation, and improve readability.

                  1 Reply Last reply
                  0
                  • K Keith Barrow

                    I don't like this way of working personally, I think the semantics are less clear and it always feels like cutting the suit to match the cloth to me. I vaguely remember it was a good idea to use the 2nd form in C++, the compiler wouldn't throw an error otherwise, and would happily set btnPause.Content to "Pause" I haven't voted (and won't :-) ) vote on your response - I don't think there is anything wrong with what you said, it is just a different opinion about how to work.

                    ragnaroknrol The Internet is For Porn[^]
                    Pete o'Hanlon: If it wasn't insulting tools, I'd say you were dumber than a bag of spanners.

                    L Offline
                    L Offline
                    Lost User
                    wrote on last edited by
                    #9

                    I have to say I tend to use the alternate form somewhat less these days, but it was offered to me years ago as a good way of catching such mistakes, especially in the days before C++ when I was writing pure C. And as for the down voting, well frankly my dear ... I just wish these jerks would have the guts to add a reasoned and useful argument as the rest of you have done.

                    It's time for a new signature.

                    1 Reply Last reply
                    0
                    • T Tichaona J

                      I keep getting the below error message when I try and run my code. Error 3 Cannot implicitly convert type 'object' to 'bool'. An explicit conversion exists (are you missing a cast?) When I try run the below code: private void Pause_Click(object sender, RoutedEventArgs e) { if (btnPause.Content = "Pause") <<<<

                      O Offline
                      O Offline
                      Orjan Westin
                      wrote on last edited by
                      #10

                      There's a difference between

                      if (btnPause.Content = "Pause")

                      and

                      if (btnPause.Content == "Pause")

                      You aren't comparing with btnPause.Content, but assigning to it. The assignment operator returns the assigned object, so in effect your code is like this:

                      btnPause.Content = "Pause";
                      if (btnPause)

                      It's a classic typo-bug, and the safest way of avoiding it is to make a habit of putting the constant (if you have one) to the left:

                      if ("Pause" = btnPause.Content)

                      This would give a compiler error along the lines of "Cannot assign to constant", which is more helpful.

                      L 1 Reply Last reply
                      0
                      • O Orjan Westin

                        There's a difference between

                        if (btnPause.Content = "Pause")

                        and

                        if (btnPause.Content == "Pause")

                        You aren't comparing with btnPause.Content, but assigning to it. The assignment operator returns the assigned object, so in effect your code is like this:

                        btnPause.Content = "Pause";
                        if (btnPause)

                        It's a classic typo-bug, and the safest way of avoiding it is to make a habit of putting the constant (if you have one) to the left:

                        if ("Pause" = btnPause.Content)

                        This would give a compiler error along the lines of "Cannot assign to constant", which is more helpful.

                        L Offline
                        L Offline
                        Lost User
                        wrote on last edited by
                        #11

                        I already suggested this above; you may want to read Harold, Luc and Keith's comments in response. Also note that someone around here really hates this idea and is downvoting us for suggesting it. I've given you a 5 to compensate. ;)

                        It's time for a new signature.

                        O 1 Reply Last reply
                        0
                        • L Lost User

                          I already suggested this above; you may want to read Harold, Luc and Keith's comments in response. Also note that someone around here really hates this idea and is downvoting us for suggesting it. I've given you a 5 to compensate. ;)

                          It's time for a new signature.

                          O Offline
                          O Offline
                          Orjan Westin
                          wrote on last edited by
                          #12

                          Yes, I saw that once I'd replied. It was the changed subject line that threw me off. Sorry, I'm new in the neighbourhood. :)

                          L E 2 Replies Last reply
                          0
                          • L Lost User

                            Instead of coding:

                            if (btnPause.Content == "Pause")

                            try writing it this way round

                            if ("Pause" == btnPause.Content)

                            then when you inadvertently miss one of the = signs the compiler will give you a much more useful message.

                            It's time for a new signature.

                            P Offline
                            P Offline
                            PIEBALDconsult
                            wrote on last edited by
                            #13

                            I used to work in a shop (doing just plain C) that had that specified in the coding standards. It made no sense to me, but I went along. One day I was talking with "the guru" (who probably wrote the standard) and he agreed that it was pointless so he didn't enforce it. The basic problem is that it only works when comparing an Lvalue and an Rvalue; many times that is not the case, so you need to think about what you are doing and recognize the situation. And if you can do that, then chances are you won't make that mistake anyway. When it comes right down to it; anyone who is prone to that kind of mistake is also unlikely to remember the rule. By the way... HP C V7.3-009 on OpenVMS Alpha V8.3 says:

                            JB> cc aa.c /warn=(enable=(check),verbose)

                            if ( result = 5 )
                            

                            ....^
                            %CC-I-CONTROLASSIGN, In this statement, the assignment expression "result=5" is used as the controlling expression of an if, while o
                            r for statement.
                            at line number 13 in file MY$ROOT:[000000]AA.C;3
                            Description: A common user mistake is to accidentally use assignment operator "=" instead of the equality operator "==" in an expres
                            sion that controls a transfer. For example saying if (a = b) instead of if (a == b). While using the assignment operator is valid,
                            it is often not what was intended. When this message is enabled, the compiler will detect these cases at compile-time. This can oft
                            en avoid long debugging sessions needed to find the bug in the user's program.
                            User Action: Make sure that the assignment operator is what is expected.

                            if ( 5 = result )
                            

                            .........^
                            %CC-E-NEEDLVALUE, In this statement, "5" is not an lvalue, but occurs in a context that requires one.
                            at line number 18 in file MY$ROOT:[000000]AA.C;3
                            Description: An expression that must be an lvalue was not an lvalue. For example, the operand of the address-of operator must be an
                            lvalue.
                            User Action: Modify the expression so that it is an lvalue.

                            Edit:

                            C:\>cc aa
                            Borland C++ 5.5 for Win32 Copyright (c) 1993, 2000 Borland
                            aa.c:
                            Warning W8060 aa.c 14: Possibly incorrect assignment in function main

                            C:\>\mingw\bin\gcc -Wall aa.c
                            aa.c: In function `main':
                            aa.c:14: warning: suggest parentheses around assignment used as truth value

                            modified on Saturday, August 7, 2010 11:40 PM

                            L L 2 Replies Last reply
                            0
                            • P PIEBALDconsult

                              I used to work in a shop (doing just plain C) that had that specified in the coding standards. It made no sense to me, but I went along. One day I was talking with "the guru" (who probably wrote the standard) and he agreed that it was pointless so he didn't enforce it. The basic problem is that it only works when comparing an Lvalue and an Rvalue; many times that is not the case, so you need to think about what you are doing and recognize the situation. And if you can do that, then chances are you won't make that mistake anyway. When it comes right down to it; anyone who is prone to that kind of mistake is also unlikely to remember the rule. By the way... HP C V7.3-009 on OpenVMS Alpha V8.3 says:

                              JB> cc aa.c /warn=(enable=(check),verbose)

                              if ( result = 5 )
                              

                              ....^
                              %CC-I-CONTROLASSIGN, In this statement, the assignment expression "result=5" is used as the controlling expression of an if, while o
                              r for statement.
                              at line number 13 in file MY$ROOT:[000000]AA.C;3
                              Description: A common user mistake is to accidentally use assignment operator "=" instead of the equality operator "==" in an expres
                              sion that controls a transfer. For example saying if (a = b) instead of if (a == b). While using the assignment operator is valid,
                              it is often not what was intended. When this message is enabled, the compiler will detect these cases at compile-time. This can oft
                              en avoid long debugging sessions needed to find the bug in the user's program.
                              User Action: Make sure that the assignment operator is what is expected.

                              if ( 5 = result )
                              

                              .........^
                              %CC-E-NEEDLVALUE, In this statement, "5" is not an lvalue, but occurs in a context that requires one.
                              at line number 18 in file MY$ROOT:[000000]AA.C;3
                              Description: An expression that must be an lvalue was not an lvalue. For example, the operand of the address-of operator must be an
                              lvalue.
                              User Action: Modify the expression so that it is an lvalue.

                              Edit:

                              C:\>cc aa
                              Borland C++ 5.5 for Win32 Copyright (c) 1993, 2000 Borland
                              aa.c:
                              Warning W8060 aa.c 14: Possibly incorrect assignment in function main

                              C:\>\mingw\bin\gcc -Wall aa.c
                              aa.c: In function `main':
                              aa.c:14: warning: suggest parentheses around assignment used as truth value

                              modified on Saturday, August 7, 2010 11:40 PM

                              L Offline
                              L Offline
                              Luc Pattyn
                              wrote on last edited by
                              #14

                              Right. I've seen some C compilers (don't recall which, I've used so many for all kinds of embedded systems) also warning about the probably mistaken assignment in an if statement. :)

                              Luc Pattyn [Forum Guidelines] [Why QA sucks] [My Articles] Nil Volentibus Arduum

                              Please use <PRE> tags for code snippets, they preserve indentation, and improve readability.

                              1 Reply Last reply
                              0
                              • T Tichaona J

                                I keep getting the below error message when I try and run my code. Error 3 Cannot implicitly convert type 'object' to 'bool'. An explicit conversion exists (are you missing a cast?) When I try run the below code: private void Pause_Click(object sender, RoutedEventArgs e) { if (btnPause.Content = "Pause") <<<<

                                P Offline
                                P Offline
                                PIEBALDconsult
                                wrote on last edited by
                                #15

                                Personally, I'd prefer to hide the Pause button and show the resume button rather than repurpose the one button and do string compares.

                                1 Reply Last reply
                                0
                                • O Orjan Westin

                                  Yes, I saw that once I'd replied. It was the changed subject line that threw me off. Sorry, I'm new in the neighbourhood. :)

                                  L Offline
                                  L Offline
                                  Lost User
                                  wrote on last edited by
                                  #16

                                  Cool Cow Orjan wrote:

                                  Sorry, I'm new in the neighbourhood.

                                  No problem, we all make mistakes from time to time. And welcome to CodeProject, judging by some of your posts I have seen I am sure your contributions will have a positive impact for many people. :thumbsup:

                                  It's time for a new signature.

                                  1 Reply Last reply
                                  0
                                  • P PIEBALDconsult

                                    I used to work in a shop (doing just plain C) that had that specified in the coding standards. It made no sense to me, but I went along. One day I was talking with "the guru" (who probably wrote the standard) and he agreed that it was pointless so he didn't enforce it. The basic problem is that it only works when comparing an Lvalue and an Rvalue; many times that is not the case, so you need to think about what you are doing and recognize the situation. And if you can do that, then chances are you won't make that mistake anyway. When it comes right down to it; anyone who is prone to that kind of mistake is also unlikely to remember the rule. By the way... HP C V7.3-009 on OpenVMS Alpha V8.3 says:

                                    JB> cc aa.c /warn=(enable=(check),verbose)

                                    if ( result = 5 )
                                    

                                    ....^
                                    %CC-I-CONTROLASSIGN, In this statement, the assignment expression "result=5" is used as the controlling expression of an if, while o
                                    r for statement.
                                    at line number 13 in file MY$ROOT:[000000]AA.C;3
                                    Description: A common user mistake is to accidentally use assignment operator "=" instead of the equality operator "==" in an expres
                                    sion that controls a transfer. For example saying if (a = b) instead of if (a == b). While using the assignment operator is valid,
                                    it is often not what was intended. When this message is enabled, the compiler will detect these cases at compile-time. This can oft
                                    en avoid long debugging sessions needed to find the bug in the user's program.
                                    User Action: Make sure that the assignment operator is what is expected.

                                    if ( 5 = result )
                                    

                                    .........^
                                    %CC-E-NEEDLVALUE, In this statement, "5" is not an lvalue, but occurs in a context that requires one.
                                    at line number 18 in file MY$ROOT:[000000]AA.C;3
                                    Description: An expression that must be an lvalue was not an lvalue. For example, the operand of the address-of operator must be an
                                    lvalue.
                                    User Action: Modify the expression so that it is an lvalue.

                                    Edit:

                                    C:\>cc aa
                                    Borland C++ 5.5 for Win32 Copyright (c) 1993, 2000 Borland
                                    aa.c:
                                    Warning W8060 aa.c 14: Possibly incorrect assignment in function main

                                    C:\>\mingw\bin\gcc -Wall aa.c
                                    aa.c: In function `main':
                                    aa.c:14: warning: suggest parentheses around assignment used as truth value

                                    modified on Saturday, August 7, 2010 11:40 PM

                                    L Offline
                                    L Offline
                                    Lost User
                                    wrote on last edited by
                                    #17

                                    I thought I had seen something like that in my days as a UNIX programmmer, it must have been gcc and possibly Sun' own C/C++ compiler.

                                    It's time for a new signature.

                                    1 Reply Last reply
                                    0
                                    • T Tichaona J

                                      I keep getting the below error message when I try and run my code. Error 3 Cannot implicitly convert type 'object' to 'bool'. An explicit conversion exists (are you missing a cast?) When I try run the below code: private void Pause_Click(object sender, RoutedEventArgs e) { if (btnPause.Content = "Pause") <<<<

                                      C Offline
                                      C Offline
                                      cor2879
                                      wrote on last edited by
                                      #18

                                      Personally when performing value comparisons with strings (and many other types) I find I am far less prone to syntax errors if I make myself use the "Equals" method. With strings in particular, it is a good practice to use the static method

                                      String.Equals(string a, string b)

                                      as this eliminates the possibility of a null reference exception. With this in mind, the boolean in your if statement would look like this:

                                      if (String.Equals(btnPause.Content, "Pause"))

                                      "We are men of action; lies do not become us."

                                      J 1 Reply Last reply
                                      0
                                      • T Tichaona J

                                        I keep getting the below error message when I try and run my code. Error 3 Cannot implicitly convert type 'object' to 'bool'. An explicit conversion exists (are you missing a cast?) When I try run the below code: private void Pause_Click(object sender, RoutedEventArgs e) { if (btnPause.Content = "Pause") <<<<

                                        M Offline
                                        M Offline
                                        michaelbierly
                                        wrote on last edited by
                                        #19

                                        you are trying to assign "Pause" to btnPause.content (=) you need the equality comparison operator (==) I dont have a lot of context to what you are doing, but you might want to try refering to sender rather than btnPause in the code.

                                        1 Reply Last reply
                                        0
                                        • T Tichaona J

                                          I keep getting the below error message when I try and run my code. Error 3 Cannot implicitly convert type 'object' to 'bool'. An explicit conversion exists (are you missing a cast?) When I try run the below code: private void Pause_Click(object sender, RoutedEventArgs e) { if (btnPause.Content = "Pause") <<<<

                                          T Offline
                                          T Offline
                                          tom1443
                                          wrote on last edited by
                                          #20

                                          Ah, bitten by the old "==" typo. Don't feel bad it was my first coding mistake in C 25 years ago. I still occasionally make that error but it usually takes me a whole lot less time to find it.

                                          1 Reply Last reply
                                          0
                                          Reply
                                          • Reply as topic
                                          Log in to reply
                                          • Oldest to Newest
                                          • Newest to Oldest
                                          • Most Votes


                                          • Login

                                          • Don't have an account? Register

                                          • Login or register to search.
                                          • First post
                                            Last post
                                          0
                                          • Categories
                                          • Recent
                                          • Tags
                                          • Popular
                                          • World
                                          • Users
                                          • Groups