Erreur: impossible de convertir implicitement le type ‘bool?’ “bool”. Une conversion explicite existe (manque-t-il un casting?)
Code:
Test obj = new Test(); obj.IsDisplay = chkDisplay.IsChecked;
mais quand j’utilise cela signifie cast dans bool alors il n’y a pas d’erreur.
Test obj = new Test(); obj.IsDisplay = (bool) chkDisplay.IsChecked;
J’ai besoin de savoir ça, pourquoi avoir besoin de lancer ce bool to bool.
Merci
Vous avez déclaré IsChecked
comme un bool?
( Nullable
). Un booléen nullable peut être true
, false
ou null
. Maintenant, demandez-vous: si IsChecked
était null, quelle valeur atsortingbuer à IsDisplay
(qui ne peut prendre qu’un true
ou un false
)? La réponse est qu’il n’y a pas de réponse correcte. Un casting implicite ici ne peut que générer des problèmes cachés, c’est pourquoi les concepteurs ont décidé d’autoriser uniquement une conversion explicite et non implicite.
Comme les autres ont déclaré bool?
n’est pas égal à bool
. bool?
peut également être null
, voir Nullable
( msdn ).
Si vous savez ce que l’état null
veut impliquer, vous pouvez facilement utiliser le symbole ?? – opérateur null- coalescing ( msdn ) pour convertir votre bool?
bool
sans effets secondaires ( Exception
).
Exemple:
//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;
bool?
n’est pas un bool
. C’est en réalité un Nullable
http://msdn.microsoft.com/en-us/library/b3h38hb0(v=vs.110).aspx
Si vous avez besoin de la valeur bool
, vous devez soit lancer comme vous le faites, soit appeler la propriété .Value
sur le bool?
. Il existe également une propriété .HasValue
vous pouvez vérifier pour vous assurer qu’elle n’est pas nulle.
Si IsChecked
est null, cette ligne générera une erreur.
obj.IsDisplay = (bool) chkDisplay.IsChecked;
Je suis confronté à votre question lorsque j’utilise l’opérateur de contrôle nul ?.
:
if (!RolesList?.Any()) //Not accepted: cannot convert bool? to bool
Donc, je l’utilise plutôt
if (RolesList?.Any() != true) //value is null or false
Dans votre cas, vous devriez le définir comme suit:
obj.IsDisplay = chkDisplay.IsChecked ?? false;
bool n’est pas égal bool?
bool
peut prendre deux valeurs, true
et false
bool?
peut en prendre trois, true false
et null
C’est pourquoi ils sont différents
Vous pouvez utiliser le code ci-dessous
obj.IsDisplay = chkDisplay.IsChecked == true?true:false;
chkDisplay.IsChecked
est de type bool?
. Ce qui signifie qu’il peut contenir des valeurs true
, false
et null
. Cependant, obj.IsDisplay
est de type bool
. Ce qui signifie qu’il ne peut être que true
ou false
.
Par conséquent, vous devez explicitement le lancer dans le type bool
. Cependant, cela déclenchera toujours une exception si, la valeur que vous essayez de convertir en bool est null
.
bool? nullableBool = null; bool notNullableBool = (bool)nullableBool; //This will throw InvalidOperationException