Convert.ToBoolean以“0”值失败

我正在尝试将值"0"System.String )转换为其Boolean表示forms,如:

 var myValue = Convert.ToBoolean("0"); // throwing an exception here 

我查看了MSDN页面 ,在代码示例块中,我找到了这些行:

 ConvertToBoolean("0"); // ... Unable to convert '0' to a Boolean. 

在我的代码中,我正在从System.String转换为Boolean如下所示:

 // will be OK, but ugly code var myValue = Convert.ToBoolean(Convert.ToInt32("0")); 
  • 有没有其他方法转换为Boolean类型没有这样丑陋的代码?
  • 为什么会出现这种exception? 因为从引用类型System.String转换为值类型System.Boolean ,但System.Int32也是一个值类型,不是吗?

发生这种情况是因为Convert.ToBoolean期望以下之一:

  • "True" (String) = true
  • "False" (String) = false
  • 0 (数字类型; int,double,float等)= false
  • 任何非0 (数字类型; …)= true
  • null = false

Boolean值的任何其他值都无效。

已经有了一个干净的方法:

 var myValue = Convert.ToBoolean(Convert.ToInt32("0")); 

编辑:您可以创建一个扩展方法,为您处理一些这样的情况,同时隐藏处理转换的丑陋。

这个扩展提供了一个非常宽松的Boolean解释:

  • "True" (String)= true
  • "False" (String)= false
  • "0" (String)= false
  • 任何其他string = 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; } } 

虽然不是一个干净漂亮的方法,但它保证了获得正确价值的更多可能性。 并且, Extensions类隐藏了您的数据/业务代码。

最后,您的转换代码使用起来相对简单:

 String myString = "1"; Boolean myBoolean = myString.ToBoolean(); 
 public static class BooleanParser { public static bool SafeParse(string value) { var s = (value ?? "").Trim().ToLower(); return s == "true" || s == "1"; } } 

既然这仍然是那些转换的问题,那么扩展方法呢?

 public static class Extensions { public static bool ToBool(this string s) { return s == "0" ? false : true; } } 

所以你会像这样使用它:

 "0".ToBool(); 

现在你可以轻松地扩展这个方法来处理更多的情况,如果你想要的话。

要成功进行转换,value参数必须等于Boolean.TrueString ,值为True的常量, Boolean.FalseString ,值为False的常量,或者必须为null。 在将值与Boolean.TrueString和Boolean.FalseString进行比较时,该方法忽略大小写以及前导和尾随空格。

来自MSDN

因为Convert.ToBoolean需要一个true,如果value不为零; 否则,是的。 数值和TrueFalse String值。

如果你知道它将是一个int,那么你可以将它转换为int然后转换为bool。 以下将尝试通过尝试字符串然后尝试使用数字转换为bool。

 public bool ToBoolean(string value) { var boolValue = false; if (bool.TryParse(value, out boolValue )) { return boolValue; } var number = 0; int.TryParse(value, out number)) return Convert.ToBoolean(number); } 

足够快速和简单:

 public static class Extensions { static private List trueSet = new List { "true","1","yes","y" }; public static Boolean ToBoolean(this string str) { try { return trueSet.Contains(str.ToLower()); } catch { return false; } } } 

这是一个非常宽容的解析器,可以键入第一个字符:

 public static class StringHelpers { ///  /// Convert string to boolean, in a forgiving way. ///  /// String that should either be "True", "False", "Yes", "No", "T", "F", "Y", "N", "1", "0" /// If the trimmed string is any of the legal values that can be construed as "true", it returns true; False otherwise; public static bool ToBoolFuzzy(this string stringVal) { string normalizedString = (stringVal?.Trim() ?? "false").ToLowerInvariant(); bool result = (normalizedString.StartsWith("y") || normalizedString.StartsWith("t") || normalizedString.StartsWith("1")); return result; } }