繁体   English   中英

字符串未被识别为有效的布尔值

[英]String was not recognized as a valid boolean

我通过套接字发送布尔值的字符串表示,并在另一端读取它。

void Send(bool value)
{
    Socket.Send(value.ToString());
}

void Receive()
{
    string message = Socket.Receive();

    Console.WriteLine(message) // Always equal to either 'True' or 'False (without quotes)

    bool result = bool.Parse(message) // here I get the format exception.
}

但是当我尝试解析我的message时,我得到以下异常:

String was not recognized as a valid boolean

我得到异常时的值是: True 没有空格。

乍一看,我认为它有一个未修剪空间的问题...,但事实并非如此,因为Boolean.Parse使用TryParse ,反过来,它在其中一次尝试中修剪空间:

public static Boolean Parse (String value) {
    if (value==null) throw new ArgumentNullException("value");
    Contract.EndContractBlock();
    Boolean result = false;
    if (!TryParse(value, out result)) {
        throw new FormatException(Environment.GetResourceString("Format_BadBoolean"));            
    }
    else {
        return result;
    }
}

public static Boolean TryParse (String value, out Boolean result) {
    result = false;
    if (value==null) {
        return false;
    }
    // For perf reasons, let's first see if they're equal, then do the
    // trim to get rid of white space, and check again.
    if (TrueLiteral.Equals(value, StringComparison.OrdinalIgnoreCase)) {
        result = true;
        return true;
    }
    if (FalseLiteral.Equals(value,StringComparison.OrdinalIgnoreCase)) {
        result = false;
        return true;
    }

    // Special case: Trim whitespace as well as null characters.
    value = TrimWhiteSpaceAndNull(value);

    if (TrueLiteral.Equals(value, StringComparison.OrdinalIgnoreCase)) {
        result = true;
        return true;
    }

    if (FalseLiteral.Equals(value,StringComparison.OrdinalIgnoreCase)) {
        result = false;
        return true;
    }

    return false;
}

参考: http //referencesource.microsoft.com/#mscorlib/system/boolean.cs,e2a8f2e50ecf93c0,references

所以,必须有其他事情发生。 也许格式存在问题,UTF-8,ANSI,ASCII等。你的一个要求就是你想要一个bool,这样你就不会有两个TrueFalse案例,所以为什么不做类似的事情呢?这个:

bool result = message.ToLower().Contains("true"); // true or false

编辑:

在阅读了一些评论后,您似乎期待案例超越TrueFalse ,在这种情况下结果可能无效。 我建议像这样:

var lMessage = message.ToLower();
bool? result = lMessage.Equals("true") ? true : lMessage.Equals("false") ? false : null;

所以,如果消息包含True ,那就是true ; 如果False ,这是false ; 否则,它为null ,表示无效的消息。 然后,您可以检查result是否为null并显示无效消息或执行其他操作。 我不确定你的常规是什么。

尝试这个:

void Receive()
{
    string message = Socket.Receive();

    Console.WriteLine(message) // Always equal to either 'True' or 'False (without quotes)

    bool result = message.ToLower().Equals("true");
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM