ne peut pas implicitement convertir le type ‘bool?’ “bool”. Une conversion explicite existe (manque-t-il un casting?)

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