Cannot implicitly convert type 'object' to 'bool'
-
Jonathan C Dickinson wrote:
This would be more difficult to read (albeit probably less confusing) without the explicit identity equality operator:
Except your example uses the inequality operator. :doh:
It's time for a new signature.
I was talking hypothetically, i.e. if '=' was the identity equality operator; expressions like the one I used wouldn't work.
while((line == reader.ReadLine()) != null) { } // This is what I was talking about.
He who asks a question is a fool for five minutes. He who does not ask a question remains a fool forever. [Chineese Proverb] Jonathan C Dickinson (C# Software Engineer)
-
I was talking hypothetically, i.e. if '=' was the identity equality operator; expressions like the one I used wouldn't work.
while((line == reader.ReadLine()) != null) { } // This is what I was talking about.
He who asks a question is a fool for five minutes. He who does not ask a question remains a fool forever. [Chineese Proverb] Jonathan C Dickinson (C# Software Engineer)
-
Jonathan C Dickinson wrote:
if '=' was the identity equality operator; expressions like the one I used wouldn't work.
I don't see that that follows, since the compiler would still recognise
!=
as the not equals operator.It's time for a new signature.
Hurm... The example doesn't need a
==
operator because it is demonstrating what is possible when a=
and a==
are distinct. With==
around;=
becomes more versatile. Because=
is more versatile the example I gave is possible. If there was only=
(and no==
) the example I gave simply wouldn't work (you would get an warning saying that a boolean is never null). I think the mathematical term for this kind of 'proof' is proof by contradiction. The compiler would recognize!=
as the not equals operator, BUT it would recognize the=
as identity equality and not assignment. Thus the AST would look (where the VB-route is taken) something like this:WHILESTMT(BOOLEXPR(BOOLEXPR("line", Operator.IdentityEquality, "reader.ReadLine"), Operator.IdentityInequality, NULL))
As opposed to (and why my example works):WHILESTMT(BOOLEXPR(BOOLEXPR("line", **_Operator.Assign_**, "reader.ReadLine"), Operator.IdentityInequality, NULL))
More simply, the following expression results in a boolean type (and boolean value) in VB:a = b
In C# is results in the type of 'a' (and the value contained by 'a'). Which is why these statements are possible:int0 = int1 = int2 = int3 = int4 = 0; // Set all to 0.
He who asks a question is a fool for five minutes. He who does not ask a question remains a fool forever. [Chineese Proverb] Jonathan C Dickinson (C# Software Engineer)
-
Hurm... The example doesn't need a
==
operator because it is demonstrating what is possible when a=
and a==
are distinct. With==
around;=
becomes more versatile. Because=
is more versatile the example I gave is possible. If there was only=
(and no==
) the example I gave simply wouldn't work (you would get an warning saying that a boolean is never null). I think the mathematical term for this kind of 'proof' is proof by contradiction. The compiler would recognize!=
as the not equals operator, BUT it would recognize the=
as identity equality and not assignment. Thus the AST would look (where the VB-route is taken) something like this:WHILESTMT(BOOLEXPR(BOOLEXPR("line", Operator.IdentityEquality, "reader.ReadLine"), Operator.IdentityInequality, NULL))
As opposed to (and why my example works):WHILESTMT(BOOLEXPR(BOOLEXPR("line", **_Operator.Assign_**, "reader.ReadLine"), Operator.IdentityInequality, NULL))
More simply, the following expression results in a boolean type (and boolean value) in VB:a = b
In C# is results in the type of 'a' (and the value contained by 'a'). Which is why these statements are possible:int0 = int1 = int2 = int3 = int4 = 0; // Set all to 0.
He who asks a question is a fool for five minutes. He who does not ask a question remains a fool forever. [Chineese Proverb] Jonathan C Dickinson (C# Software Engineer)
-
You can't get a NRE using the == operator. The .Net runtime essentially does this:
if (Object.ReferenceEquals(a, null) && Object.ReferenceEquals(b, null)) return true;
else if (Object.ReferenceEquals(a, null) || Object.ReferenceEquals(b, null)) return false;
else return a.Equals(b);Unless you override the == operator (in which case you should do this in the header). The String.Equals is better because you would be more inclined to use the StringComparison enum[^] - but that is only the case for Strings.
He who asks a question is a fool for five minutes. He who does not ask a question remains a fool forever. [Chineese Proverb] Jonathan C Dickinson (C# Software Engineer)
Jonathan, I can see why my language may have been confusing. I was not meaning to imply that using the == operator would result in a NullReferenceException. My first statement was that the "Equals" method should be used to make the comparison, and I then went on to state that the static method should be preferred for strings (rather than the instance method) since using the instance method could result in a NullReferenceException while using the static method will not. Looking back at my post, however, I can see why one might think I was implying something different, which was not my intent. Regardless, thanks.
"We are men of action; lies do not become us."
-
Ok, first things first...If this is August 10th, I will gladly eat this post. Why are the messages all dated the 10th? Secondly, being "new in the neighbourhood" sounds like a good reason for everyone to pile on and really "get you" for not plowing through all of the messages!! LOL! :laugh:
The messages are dated [date] [month] [year], so they're all posted in 2010, or '10 for short. And it's August 10th now... As for piling on, I'd expect to be shouted at for factual errors, or bad advice (like saying "Use Emacs" ;-) but not so much for being a newbie. And should that happen, well, I've been online long enough to grow a reasonably thick skin.
-
*shrug* :)
He who asks a question is a fool for five minutes. He who does not ask a question remains a fool forever. [Chineese Proverb] Jonathan C Dickinson (C# Software Engineer)
-
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.
The point isn't that the compiler gives a more useful message (as has been pointed out), the point is it will give an error message even if the type in question in fact has a conversion-to-bool operator! Whether or not you cannot figure out what the actual cause of the resulting message is, is an entirely different question. I'd suppose everyone intelligent enough to put literals on the left hand side of a comparison will recognise what it means when the compiler states he wants an lvalue! At least I am ;)
-
The point isn't that the compiler gives a more useful message (as has been pointed out), the point is it will give an error message even if the type in question in fact has a conversion-to-bool operator! Whether or not you cannot figure out what the actual cause of the resulting message is, is an entirely different question. I'd suppose everyone intelligent enough to put literals on the left hand side of a comparison will recognise what it means when the compiler states he wants an lvalue! At least I am ;)
-
I agree, but it seems this construct is no longer 'in vogue'. Being a sheep I'll just follow the herd. ;)
It's time for a new signature.
Hmm, has it ever been 'en vogue'? Judging by my experience, I believe the reason why 'nobody' uses it is that few people know about it, not that it isn't 'en vogue' any more. Also, it seems more natural to ask 'does x currently have a value of 2?' than 'does 2 happen to be the value currently stored in x?'. So even when I tell people about it, they might be reluctant to change their style accordingly.
-
Hmm, has it ever been 'en vogue'? Judging by my experience, I believe the reason why 'nobody' uses it is that few people know about it, not that it isn't 'en vogue' any more. Also, it seems more natural to ask 'does x currently have a value of 2?' than 'does 2 happen to be the value currently stored in x?'. So even when I tell people about it, they might be reluctant to change their style accordingly.
Stefan63 wrote:
has it ever been 'en vogue'?
Possibly not, but it was certainly common practice at my last company, which had a fairly large group of developers around the world. I've never actually tried to see if it's in any of the published books on C++ (or C).
It's time for a new signature.