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

C# 字符串未被识别为有效的布尔值,c#,formatexception,C#,Formatexception,我通过套接字发送布尔值的字符串表示,并在另一端读取它 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 res

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

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.
}
但是,当我尝试解析我的
消息时,会出现以下异常:

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

获取异常时的值为:
True
。没有空格。

尝试以下操作:

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

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

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

乍一看,我会认为它有一个未修剪的空间的问题……但情况并非如此,因为<代码>布尔。PARSE <代码>使用<代码> TyPARSE < /C> >,然后,在其尝试之一中修剪空间:

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;
}
参考资料:

所以,肯定还有别的事情发生。可能是格式、UTF-8、ANSI、ASCII等方面存在问题。您的要求之一是您需要bool,这样您就不会有两种情况下的
True
False
,所以为什么不这样做:

bool result = message.ToLower().Contains("true"); // true or false
var lMessage = message.ToLower();
bool? result = lMessage.Equals("true") ? true : lMessage.Equals("false") ? false : null;
编辑:

在阅读了一些评论之后,您似乎期待的案例超出了
True
False
,在这种情况下,结果可能无效。我建议这样做:

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

因此,如果消息包含
True
,则为
True
;如果
False
,则为
False
;否则,它是
null
,表示消息无效。然后,您可以检查
结果
是否为
,并显示无效消息或执行其他操作。我不确定从那以后你的日常工作是什么。

你绝对确定你收到的是什么吗?如果您在框架中发现了一个真正的bug,我会感到震惊-当您得到异常时,消息的值是多少?您的消息中有任何特殊字符吗?请尝试
bool.Parse(“True”)
并查看是否仍然得到formatexception?如果您没有,那么您收到的消息就不完全是“True”…我会在调试器中查看接收字符串包含的内容,或者更好地在监视窗口中查看put message.tocharray(),并查看其中是否有任何“特殊”字符。有时我会看到字符串中的控制字符没有打印出来,但仍然存在。显然,这是可行的,但我更喜欢使用bool.Parse,否则我必须对false进行另一种处理。不,如果消息为“false”,那么user2004810的解决方案仍然会通过。bool.Parse不是必需的。方法Equals(“true”)已经返回true/false,您不需要另一个case。@Ben您不能假设所有不为true的都是false吗?@tschmit007 no NotTrue!=如果为False,则您也可能有无效消息。