Ciò accade perché Convert.ToBoolean
si aspetta una delle seguenti operazioni:
"True"
(String) = true
"False"
(String) = false
0
(tipo numerico; int, double, float, etc.) = false
- Qualsiasi non-
0
(tipo numerico; ...) = true
null
= false
Qualsiasi altro valore non è valido per Boolean
.
quali hai già ottenuto un pulito approccio:
var myValue = Convert.ToBoolean(Convert.ToInt32("0"));
Edit: È possibile creare un metodo di estensione che gestirà alcuni di questi casi per voi, mentre si nascondeva via la la bruttezza di gestire la conversione.
Questa estensione fornisce un'interpretazione molto libera di Boolean
:
"True"
(String) = true
"False"
(String) = false
"0"
(String) = false
- Qualsiasi altra stringa =
true
Codice:
public static class Extensions
{
public static Boolean ToBoolean(this string str)
{
String cleanValue = (str ?? "").Trim();
if (String.Equals(cleanValue, "False", StringComparison.OrdinalIgnoreCase))
return false;
return
(String.Equals(cleanValue, "True", StringComparison.OrdinalIgnoreCase)) ||
(cleanValue != "0");
}
}
In alternativa, se si desidera un approccio più rigoroso, che segue quello che il .NET Framework si aspetta; quindi è sufficiente utilizzare try/catch
dichiarazioni:
public static class Extensions
{
public static Boolean ToBoolean(this string str)
{
try
{
return Convert.ToBoolean(str);
}
catch { }
try
{
return Convert.ToBoolean(Convert.ToInt32(str));
}
catch { }
return false;
}
}
Anche se, non un pulito o abbastanza approccio, ma garantisce maggiori possibilità di ottenere il valore corretto. E la classe Extensions
è nascosta ai tuoi dati/codice commerciale.
Alla fine, il codice di conversione è relativamente semplice da usare:
String myString = "1";
Boolean myBoolean = myString.ToBoolean();
L'esempio si fa riferimento sta dimostrando che ci sono le stringhe non valide che il metodo ToBoolean() rifiuterà. Oltre a "0", mostrano esempi di "TrueString" e string.Empty. L'esempio mostra che questi non sono validi, non che puoi effettivamente utilizzare quei valori. –
perché non usare var res = "1yestrue" .Contains (yourVar)? Ci sono anche Boolean.Parse()/Boolean.TryParse()? – Bernhard