Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/24.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
.net Convert.ToBoolean和Boolean.Parse don';不接受0和1_.net_Boolean - Fatal编程技术网

.net Convert.ToBoolean和Boolean.Parse don';不接受0和1

.net Convert.ToBoolean和Boolean.Parse don';不接受0和1,.net,boolean,.net,Boolean,为什么决定在解析布尔值时,0/1是不可接受的 当解析任何整型值时,它接受要解析的数字字符串。(如果.NET能够解析字符串“一亿贰拾陆万伍仟捌佰陆拾伍”,我会感到惊讶) 是什么让布尔人与众不同?在我的经验中,它们基本上是0为假,非0为真 是否有bcl方法来解析这样的字符串,如果没有,为什么 注意:我忘记在字符串中指定“0”和“1”。奇怪的是,如果已经是一个int,它会像我预期的那样工作。也许这引起了混乱 是什么让布尔人与众不同?在我的经验中,它们基本上是0为假,非0为真 这是一个实现细节,根本不相

为什么决定在解析布尔值时,0/1是不可接受的

当解析任何整型值时,它接受要解析的数字字符串。(如果.NET能够解析字符串“一亿贰拾陆万伍仟捌佰陆拾伍”,我会感到惊讶)

是什么让布尔人与众不同?在我的经验中,它们基本上是0为假,非0为真

是否有bcl方法来解析这样的字符串,如果没有,为什么

注意:我忘记在字符串中指定“0”和“1”。奇怪的是,如果已经是一个int,它会像我预期的那样工作。也许这引起了混乱

是什么让布尔人与众不同?在我的经验中,它们基本上是0为假,非0为真

这是一个实现细节,根本不相关

true
是一个布尔值
false
是一个布尔值。其他任何东西都不是

如果要分析字符串“0”的计算结果为
false
,而其他任何内容的计算结果为
true
,则可以使用:

!mystr.Equals("0");

您需要
Convert.ToBoolean(int-value)
不确定解析方法有什么问题:-)

无用途代码:

        int falseInt = 0;
        int trueInt = 1;

        bool falseBool;
        bool trueBool;

        if (bool.TryParse(falseInt.ToString(), out falseBool))
        {
            if (!falseBool)
            {
                MessageBox.Show("TryParse: False");
            }
        }

        if (bool.TryParse(trueInt.ToString(), out trueBool))
        {
            if (!trueBool)
            {
                MessageBox.Show("TryParse: True");
            }
        }

        falseBool = Convert.ToBoolean(falseInt);
        trueBool = Convert.ToBoolean(trueInt);

        if (!falseBool)
        {
            MessageBox.Show("Convert: False");
        }

        if (trueBool)
        {
            MessageBox.Show("Convert: True");
        }
0和(不是零)不等于“false”和“true”,它们只是C选择的表示形式。其他语言使用0表示true,使用-1表示false,或者完全使用其他模式。布尔值不是0或1,它是真或假


它是否也应该处理“是”和“否”、“关”和“开”,以及所有其他类似于布尔人的事情?你的底线在哪里?

不幸的是,这种情况在.NET中经常发生。例如,我不记得是XML序列化程序还是XmlConvert,但如果True/False的大小写不正确,其中一个就会失败

您可以通过整数进行往返以获得所需的内容

string s = "2";
int i = Convert.ToInt32(s);
bool b = Convert.ToBoolean(i);
在上述情况下,任何非零的值都将计算为true

因此,我创建了一个我广泛使用的类,名为ConversionStrategy,它考虑了源类型和目标类型,并选择了最理想(和最灵活)的转换策略来进行转换。

这怎么样

  byte i = 1; //or 0
  bool myBool = BitConverter.ToBoolean(new byte[] { i }, 0)

下面显示的共享
FormatHelper
类使用名为
StringToBoolean
的重载方法的两个变体提供了一个简单的解决方案

FormatHelper.StringToBoolean(String value)
FormatHelper.StringToBoolean(String value, Boolean NullOrEmptyDefault)
这两种变体都提供了不区分大小写的字符串匹配

1)从字符串到布尔值的正常转换,将空字符串或空字符串默认为
false

以下示例将导致
布尔值
为false
:-

 Boolean myBool = FormatHelper.StringToBoolean("");
 Boolean myBool = FormatHelper.StringToBoolean("0");
 Boolean myBool = FormatHelper.StringToBoolean("false");
 Boolean myBool = FormatHelper.StringToBoolean("False");
 Boolean myBool = FormatHelper.StringToBoolean("no");
 Boolean myBool = FormatHelper.StringToBoolean("off");
所有其他字符串值将产生
布尔值
true
,例如:-

 Boolean myBool = FormatHelper.StringToBoolean("1");
 Boolean myBool = FormatHelper.StringToBoolean("true");
 Boolean myBool = FormatHelper.StringToBoolean("True");
 Boolean myBool = FormatHelper.StringToBoolean("yes");
 Boolean myBool = FormatHelper.StringToBoolean("xyz blah");
注意:在下面的类中编辑
BooleanStringOff
的值,以包含更多(或更少)的false/off值

2)遵循与上述1)相同的规则,但允许将默认值
true
作为转换的第二个参数提供。

字符串
值为空或
null
时,使用默认值。如果缺少的字符串值需要表示
true
状态,则此选项非常有用

下面的代码示例将返回
true

 Boolean myBool = FormatHelper.StringToBoolean("",true);
下面的代码示例将返回
false

 Boolean myBool = FormatHelper.StringToBoolean("false",true);
这是
FormatHelper
类的代码

public class FormatHelper
{
    public static Boolean StringToBoolean(String str)
    {
        return StringToBoolean(str, false);
    }

    public static Boolean StringToBoolean(String str, Boolean bDefault)
    {
        String[] BooleanStringOff = { "0", "off", "no" };

        if (String.IsNullOrEmpty(str))
            return bDefault;
        else if(BooleanStringOff.Contains(str,StringComparer.InvariantCultureIgnoreCase))
            return false;

        Boolean result;
        if (!Boolean.TryParse(str, out result))
            result = true;

        return result;
    }
}

回答这个问题很难。也许是因为微软那些心胸狭窄的开发人员有他们自己的原因?没有对他们的不尊重。只是说,他们没有考虑它需要用于什么用途或如何使用。我想不出为什么我下面的扩展不适合任何人。我的意思是布尔值是开或关,真或假。在我看来,它基本上是二进制的。Int、Double、Char、Long、Byte等的解析方法对它们的解析方法更宽容

但是,考虑一下这个问题;您正在查看对象中是否存在值。以下情况也可能如此

string myvar = "empty"; //Or maybe = "NULL"
if (String.IsNullOrEmpty(myvar))
{
    //Should this be true?
}
总之,让我们把这件事简单化。下面是我使用扩展方法为字符串创建
ToBoolean()
方法的解决方案

using System.Linq;
public static bool ToBoolean(this string input)
{
    //Define the false keywords
    String[] bFalse = { "false", "0", "off", "no" };

    //Return false for any of the false keywords or an empty/null value
    if (String.IsNullOrEmpty(input) || bFalse.Contains(input.ToLower()))
        return false;

    //Return true for anything not false
    return true;
}

谢谢这就是我想要的,一个解释。如果某些语言确实使用0表示真,使用-1表示假,我真的认为它们搞糟了,但这是一个很好的理由,不必通过解析自动假设某些开发人员可能会盲目使用。为什么,是的。是的,它应该处理“是”/“否”/ ON。为了进一步解释为什么一些语言使用0为真,而1为假,考虑它们的二进制表示:<代码> 00000000 < /代码>和<代码> 11111111 < /代码>。@ MBOW: WTH?11111111对您来说是否听起来比00000000甚至-1更假?就我个人而言,我认为这是一个正确的定义问题,谈论个人偏好有点毫无意义,但看着二进制表示法肯定没有增强我对这一点的直觉……我认为有一个约定:0=false,其他任何东西都是true(通常是1,但如果你愿意,也可以是-1)。所以我会说00000是假的,1是真的,1111111是非常真实的!;)@阿里,你能告诉我0=真用什么语言吗?。我想到的唯一一个例子是shell,程序结束时通常返回(0),但这实际上是一个错误代码(erro=0->error=false,所以ok)。理论上,接受的答案听起来不错,但是当你看到这样的东西时,真的没有什么合理化可以让这变得有意义。更快的解决方案好简洁的解决方案,我喜欢!字符串“true”和字符串“false”是字符串,而不是布尔值。然而,在把它们转换成布尔语时,似乎没有人在识别它们的意义上有问题。如果我们足够聪明认识到“真”意味着真,那么我认为我们足够聪明认识到“1”和“1”意味着t