Это происходит потому, что Convert.ToBoolean
ожидает одно из следующих действий:
"True"
(String) = true
"False"
(String) = false
0
(числовой тип; INT, двойная, с плавающей точкой, и т.д.) = false
- Любые не
0
(числовой тип; ...) = true
null
= false
Любая другая значение является недопустимым для Boolean
.
Вы уже получили чистый подход:
var myValue = Convert.ToBoolean(Convert.ToInt32("0"));
Edit: Вы можете создать метод расширения, который будет обрабатывать некоторые из этих случаев для вас, скрывая прочь уродство обращения с конверсией.
Это расширение обеспечивает очень свободную интерпретацию Boolean
:
"True"
(String) = true
"False"
(String) = false
"0"
(String) = false
- Любая другая строка =
true
Код:
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");
}
}
В качестве альтернативы, если вы хотите более строгий подход, который следует, что ожидает .NET Framework; затем просто использовать try/catch
заявления:
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;
}
}
Albeit, не чистый или довольно подход, но это гарантирует больше возможностей получения правильного значения. И класс Extensions
спрятан от вашего кода данных/бизнеса.
В конце концов, ваш код преобразования относительно прост в использовании:
String myString = "1";
Boolean myBoolean = myString.ToBoolean();
Пример вы ссылаетесь показывает, что есть недействительные строки, метод ToBoolean() отклонит. В дополнение к «0», они показывают примеры «TrueString» и string.Empty. Образец показывает, что они недействительны, а не то, что вы действительно можете использовать эти значения. –
Почему бы не использовать var res = "1yestrue". Содержит (вашVar)? Есть также Boolean.Parse()/Boolean.TryParse()? – Bernhard