Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/329.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Convert.ToBoolean失败,带“;0“;价值_C#_Types_Reference_Value Type_Type Conversion - Fatal编程技术网

C# Convert.ToBoolean失败,带“;0“;价值

C# Convert.ToBoolean失败,带“;0“;价值,c#,types,reference,value-type,type-conversion,C#,Types,Reference,Value Type,Type Conversion,我正在尝试将值“0”(System.String)转换为其布尔表示形式,如: var myValue = Convert.ToBoolean("0"); // throwing an exception here 我查看了,在代码示例块中,我发现了以下几行: ConvertToBoolean("0"); // ... Unable to convert '0' to a Boolean. 在我的代码中,我正在从System.String转换为Boolean,如下所示: // will be

我正在尝试将值
“0”
System.String
)转换为其
布尔表示形式,如:

var myValue = Convert.ToBoolean("0"); // throwing an exception here
我查看了,在代码示例块中,我发现了以下几行:

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"));
"0".ToBool();
  • 有没有其他方法可以转换为
    Boolean
    类型,而不使用如此难看的代码
  • 为什么会出现这样的例外情况?由于从引用类型
    System.String
    转换为值类型,
    System.Boolean
    ,但是
    System.Int32
    也是值类型,不是吗

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

  • =
    true
  • =
    false
  • 0
    (数字类型;int、double、float等)=
    false
  • 任何非
    0
    (数字类型;…)=
    true
  • null
    =
    false
对于
布尔值
,任何其他值都无效

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

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

编辑:您可以创建一个扩展方法,该方法将为您处理其中一些情况,同时隐藏处理转换的丑陋性

此扩展提供了对
布尔值的非常松散的解释:

  • “True”
    (字符串)=
    True
  • “False”
    (字符串)=
    False
  • “0”
    (字符串)=
    false
  • 任何其他字符串=
    true
代码:


或者,如果您想要一个更严格的方法,它遵循.NET框架的期望;然后简单地使用
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();

static readonly HashSet\u booleanTrueStrings=新HashSet{“true”、“yes”、“1”};
静态只读哈希集_booleanFalseStrings=新哈希集{“false”、“no”、“0”};
公共静态布尔ToBoolean(字符串值)
{
var v=值?.ToLower()?.Trim()?“”;
if(_booleanTrueStrings.Contains(v))返回true;
if(_booleanFalseStrings.Contains(v))返回false;
抛出新ArgumentException(“意外的布尔格式”);
}

既然仍然需要进行这些转换之类的工作,那么扩展方法呢

public static class Extensions {
    public static bool ToBool(this string s) {
        return s == "0" ? false : true;
    }
}
然后你会这样使用它:

// will be OK, but ugly code
var myValue = Convert.ToBoolean(Convert.ToInt32("0"));
"0".ToBool();

现在,如果需要,您可以轻松地扩展此方法以处理更多的情况

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


因为
Convert.ToBoolean
需要一个数值,而
True
False
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 StringHelpers
{
    /// <summary>
    /// Convert string to boolean, in a forgiving way.
    /// </summary>
    /// <param name="stringVal">String that should either be "True", "False", "Yes", "No", "T", "F", "Y", "N", "1", "0"</param>
    /// <returns>If the trimmed string is any of the legal values that can be construed as "true", it returns true; False otherwise;</returns>
    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;
    }
}
公共静态类StringHelpers
{
/// 
///以宽容的方式将字符串转换为布尔值。
/// 
///应为“真”、“假”、“是”、“否”、“T”、“F”、“Y”、“N”、“1”、“0”的字符串
///如果修剪后的字符串是任何可以解释为“true”的合法值,则返回true;否则返回False;
公共静态bool ToBoolFuzzy(此字符串为stringVal)
{
字符串normalizedString=(stringVal?.Trim()?“false”).ToLowerInvariant();
bool result=(normalizedString.StartsWith(“y”)
||normalizedString.StartsWith(“t”)
||normalizedString.StartsWith(“1”);
返回结果;
}
}

足够快且简单:

public static class Extensions
{
        static private List<string> trueSet = new List<string> { "true","1","yes","y" };

        public static Boolean ToBoolean(this string str)
        {
            try
            { return trueSet.Contains(str.ToLower()); }
            catch { return false; }
        }
}
公共静态类扩展
{
静态私有列表trueSet=新列表{“真”、“1”、“是”、“y”};
公共静态布尔ToBoolean(此字符串str)
{
尝试
{return trueSet.Contains(str.ToLower());}
catch{return false;}
}
}
你可以这样称呼它-:

GetBoolValue("TRUE") // true
GetBoolValue("1") // true
GetBoolValue("") // false
GetBoolValue(null) // false
GetBoolValue("randomString") // false

尝试将“0”转换为布尔类型,如我在主题中所述,并查看上的msdn示例:,您将获得一个转换“0”字符串值的示例。因为
“0”
不是
“True”
“False”
。唯一接受的字符串表示形式是
“True”
“False”
。您已刷新您的答案:)它的第一个变体不同,并在列表中保留“0”,因此我的注释被引用到它,不是刷新的:)而且最干净的方法对于代码样式来说确实很难看。您可以使用扩展方法来获得您想要的解析布尔值。这将使您的代码简洁明了地从字符串转换为布尔值。@Jesse也感谢您的回答;)我认为,这样一个问题对学生来说是一个很好的练习,或者是对求职面试的一个很好的测试。只需在测试中对此类问题提出一个Q,并询问解决方案或可能的异常。您引用的示例显示存在ToBoolean()方法将拒绝的无效字符串。除了“0”之外,它们还显示了“TrueString”和string.Empty的示例。示例显示这些值无效,而不是您可以实际使用这些值。为什么不使用var res=“1yestrue”。Contains(yourVar)?还有Boolean.Parse()/Boolean.TryParse()?只需在
    public static bool GetBoolValue(string featureKeyValue)
    {
        if (!string.IsNullOrEmpty(featureKeyValue))
        {
                    try 
                    {
                        bool value;
                        if (bool.TryParse(featureKeyValue, out value))
                        {
                            return value;
                        }
                        else
                        {
                            return Convert.ToBoolean(Convert.ToInt32(featureKeyValue));
                        }
                    }
                    catch
                    {
                        return false;
                    }
         }
         else
         {
                  return false;
         }
   }
GetBoolValue("TRUE") // true
GetBoolValue("1") // true
GetBoolValue("") // false
GetBoolValue(null) // false
GetBoolValue("randomString") // false