Comment convertir un bool?
Nullable en bool
en C #?
J'ai essayé x.Value
Ou x.HasValue
...
En fin de compte, vous devez décider de ce que le null bool représentera. Si null
doit être false
, vous pouvez faire ceci:
bool newBool = x.HasValue ? x.Value : false;
Ou:
bool newBool = x.HasValue && x.Value;
Ou:
bool newBool = x ?? false;
Vous pouvez utiliser le opérateur null-coalescing : x ?? something
, où something
est une valeur booléenne que vous souhaitez utiliser si x
est null
.
Exemple:
bool? myBool = null;
bool newBool = myBool ?? false;
newBool
sera faux.
Vous pouvez utiliser la méthode Nullable{T}
GetValueOrDefault()
. Cela retournera false si null.
bool? nullableBool = null;
bool actualBool = nullableBool.GetValueOrDefault();
Le moyen le plus simple consiste à utiliser l'opérateur de coalescence nul: ??
bool? x = ...;
if (x ?? true) {
}
Le ??
avec des valeurs nullables fonctionne en examinant l'expression nullable fournie. Si l'expression nullable a une valeur, sa valeur sera utilisée, sinon elle utilisera l'expression située à droite de ??
Si vous utilisez le bool?
dans une instruction if
, je trouve que la meilleure chose à faire est de comparer avec true
ou false
.
bool? b = ...;
if (b == true) { Debug.WriteLine("true"; }
if (b == false) { Debug.WriteLine("false"; }
if (b != true) { Debug.WriteLine("false or null"; }
if (b != false) { Debug.WriteLine("true or null"; }
Bien sûr, vous pouvez également comparer avec null.
bool? b = ...;
if (b == null) { Debug.WriteLine("null"; }
if (b != null) { Debug.WriteLine("true or false"; }
if (b.HasValue) { Debug.WriteLine("true or false"; }
//HasValue and != null will ALWAYS return the same value, so use whatever you like.
Si vous voulez le convertir en un bool pour le transférer à d'autres parties de l'application, l'opérateur Null Coalesce est ce que vous voulez.
bool? b = ...;
bool b2 = b ?? true; // null becomes true
b2 = b ?? false; // null becomes false
Si vous avez déjà vérifié la valeur null et que vous souhaitez simplement obtenir la valeur, accédez à la propriété Value.
bool? b = ...;
if(b == null)
throw new ArgumentNullException();
else
SomeFunc(b.Value);
bool? a = null;
bool b = Convert.toBoolean(a);
Quelque chose comme:
if (bn.HasValue)
{
b = bn.Value
}
La voie complète serait:
bool b1;
bool? b2 = ???;
if (b2.HasValue)
b1 = b2.Value;
Ou vous pouvez tester des valeurs spécifiques en utilisant
bool b3 = (b2 == true); // b2 is true, not false or null
Cette réponse concerne le cas d'utilisation lorsque vous voulez simplement tester le bool?
dans une condition. Il peut également être utilisé pour obtenir un bool
normal. C'est une alternative que je trouve personnellement plus facile à lire que le coalescing operator ??
.
Si vous voulez tester une condition, vous pouvez l'utiliser
bool? nullableBool = someFunction();
if(nullableBool == true)
{
//Do stuff
}
Ce qui précède ne sera vrai que si le bool?
est vrai.
Vous pouvez également l'utiliser pour assigner un bool
normal à partir d'un bool?
bool? nullableBool = someFunction();
bool regularBool = nullableBool == true;
la sorcière est la même chose que
bool? nullableBool = someFunction();
bool regularBool = nullableBool ?? false;
C'est une variation intéressante sur le thème. Au premier et au deuxième regard, vous supposez que la véritable branche est prise. Pas si!
bool? flag = null;
if (!flag ?? true)
{
// false branch
}
else
{
// true branch
}
Pour obtenir ce que vous voulez, procédez comme suit:
if (!(flag ?? true))
{
// false branch
}
else
{
// true branch
}