Error : cannot implicitly convert type 'bool?' to 'bool'. An explicit conversion exists (are you missing a cast?)
Code :
Test obj = new Test();
obj.IsDisplay = chkDisplay.IsChecked;
but when I use this method to cast the property into a bool then there is no error.
Test obj = new Test();
obj.IsDisplay = (bool) chkDisplay.IsChecked;
I would like to know why I need to cast this bool to bool?
As the others stated bool?
is not equal to bool
. bool?
can also be null
, see Nullable<t>
(msdn).
If you know what the null
state wants to imply, you easily can use the ?? - null-coalescing operator (msdn) to convert your bool?
to bool
without any side effects (Exception
).
Example:
//Let´s say "chkDisplay.IsChecked = null" has the same meaning as "chkDisplay.IsChecked = false" for you
//Let "check" be the value of "chkDisplay.IsChecked", unless "chkDisplay.IsChecked" is null, in which case "check = false"
bool check = chkDisplay.IsChecked ?? false;
You've declared IsChecked
as a bool?
(Nullable<bool>
). A nullable boolean can be either true
, false
or null
. Now ask yourself: If IsChecked
was null, then what value should be assigned to IsDisplay
(which can only take a true
or false
)? The answer is that there is no correct answer. An implicit cast here could only produce hidden trouble, which is why the designers decided to only allow an explicit conversion and not an implicit one.
I'm facing your question when I'm using the null check operator ?.
:
if (!RolesList?.Any()) //Not accepted: cannot convert bool? to bool
So I'm using this instead
if (RolesList?.Any() != true)
//value is null or false
In your case you should set it like so:
obj.IsVisible = chkDisplayStuff.IsChecked ?? false;
bool?
is not a bool
. It is in reality a Nullable<bool>
http://msdn.microsoft.com/en-us/library/b3h38hb0(v=vs.110).aspx
If you need the bool
value then you should either cast like you are doing or call the .Value
property on the bool?
. There is also a .HasValue
property you can check to make sure that it is not null.
If IsChecked
is null, this line will error.
obj.IsDisplay = (bool) chkDisplay.IsChecked;
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With