Convert.ToBoolean失败,值为"0"

Sec*_*ret 22 c# types reference type-conversion value-type

我正在尝试将value "0"(System.String)转换为其Boolean表示形式,如:

var myValue = Convert.ToBoolean("0"); // throwing an exception here
Run Code Online (Sandbox Code Playgroud)

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

ConvertToBoolean("0");
// ...
Unable to convert '0' to a Boolean.
Run Code Online (Sandbox Code Playgroud)

在我的代码中,我正在转换System.StringBoolean这样:

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

Jes*_*sse 59

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

任何其他值都无效Boolean.

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

var myValue = Convert.ToBoolean(Convert.ToInt32("0"));
Run Code Online (Sandbox Code Playgroud)

编辑:您可以创建一个扩展方法,为您处理其中的一些案例,同时隐藏处理转换的丑陋.

此扩展提供了非常宽松的解释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");
    }
}
Run Code Online (Sandbox Code Playgroud)

或者,如果您需要更严格的方法,那么遵循.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;
    }
}
Run Code Online (Sandbox Code Playgroud)

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

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

String myString = "1";
Boolean myBoolean = myString.ToBoolean();
Run Code Online (Sandbox Code Playgroud)


Cha*_*ion 7

public static class BooleanParser
{
    public static bool SafeParse(string value)
    {
        var s = (value ?? "").Trim().ToLower();
        return s == "true" || s == "1";
    }
}
Run Code Online (Sandbox Code Playgroud)
static readonly HashSet<string> _booleanTrueStrings = new HashSet<string> { "true", "yes", "1" };
static readonly HashSet<string> _booleanFalseStrings = new HashSet<string> { "false", "no", "0" };

public static bool ToBoolean(string value)
{
    var v = value?.ToLower()?.Trim() ?? "";
    if (_booleanTrueStrings.Contains(v)) return true;
    if (_booleanFalseStrings.Contains(v)) return false;
    throw new ArgumentException("Unexpected Boolean Format");
}
Run Code Online (Sandbox Code Playgroud)