Xml 将布尔值转换为字符串的问题(部分时间有效,但并非全部)

Xml 将布尔值转换为字符串的问题(部分时间有效,但并非全部),xml,vb.net,string,winforms,boolean,Xml,Vb.net,String,Winforms,Boolean,谁能解释一下我哪里出了问题 为了解释标题的变化,在一个测试项目中测试这个问题时,我发现它有时会抛出,但并不总是(我知道这会使跟踪更加困难),在每种情况下,我都以同样的方式调用这个类,等等 注意:重新回答-我已将下面的答案标记为正确答案,因为它确实解决了问题,即使没有人能够解释为什么会出现此问题 为了便于解释,下面的第一个示例进行了简化,完整代码请向下滚动 我从xml中阅读如下内容: Return XElement.Value Public Class MyXml Dim __Weekl

谁能解释一下我哪里出了问题

为了解释标题的变化,在一个测试项目中测试这个问题时,我发现它有时会抛出,但并不总是(我知道这会使跟踪更加困难),在每种情况下,我都以同样的方式调用这个类,等等

注意:重新回答-我已将下面的答案标记为正确答案,因为它确实解决了问题,即使没有人能够解释为什么会出现此问题

为了便于解释,下面的第一个示例进行了简化,完整代码请向下滚动

我从xml中阅读如下内容:

Return XElement.Value
Public Class MyXml
    Dim __Weekly As New _Weekly
    Public Property Weekly As _Weekly
        Get 
            Return __Weekly
        End Get 
        Set(value As _Weekly) 
        End Set 
    End Property
    Public Class _Weekly
        Property Flag As String
            Get
                Return Readxml("_Weekly", "_Flag")
            End Get
            Set(value As String)
                SaveToXml("_Weekly", "_Flag", value)
            End Set
        End Property
    End Class
    Private Shared Function Readxml(xmlItem As String, xmlname As String)
    Readxml = Nothing
    Dim CCXml As XDocument
    If My.Computer.FileSystem.FileExists(XMLPath) Then
       CCXml = XDocument.Load(XMLPath)
       Dim xEl As XElement = (From El In CCXml.Root.Elements() Where El.Name = xmlItem).FirstOrDefault
       If Not IsNothing(xEl) Then
            Dim ChxEl As XElement = (From El2 In xEl.Elements() Where El2.Name = xmlname).FirstOrDefault
            If Not IsNothing(ChxEl) Then
                Return ChxEl.Value
            End If
       End If
    End Function
End Class
在这种情况下,
.Value
为“真”或“假”

如果我获取返回值(此Q称为ReturnedString)并执行以下操作:

它有时会在If语句上引发异常
从字符串“False”到类型“Long”的转换无效。

但是

如果我这样做:

Dim ReturnBol as Boolean = ReturnedString
If ReturnedBol then
    'some code
End If
一直都很好

仅在从xml读取时发生

xml是:

<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<Root>
  <_Weekly>
    <_Flag>True</_Flag>
  </_Weekly>
</Root>
因此,要返回字符串,请执行以下操作:

Dim myxml as New MyXml
If myxml.Weekly.Flag then

End If

请不要给我讲嵌套类和所有陷阱,我很清楚潜在的问题,但这正是我需要的(当然欢迎提出建议或建设性批评!)

CBool
是一个用于将表达式转换为布尔数据类型的函数。它的参数不能是字符串(除了“true”或“false”),这就是引发异常的原因

试一试


要获取字符串的相应布尔值,如
True
False
,应使用:

就你而言:

If Boolean.Parse(ReturnedString) Then
 'some code
End If

如果值不存在或者可以解析,请考虑使用BooLo.Pal.B/O.P>。这没有任何意义。请添加代码的相关部分,以便我们可以复制它并找到问题(必须在其他地方)。此外,DirectCast是否也会发生同样的情况?您可以尝试使用

返回字符串.Compare(XElement.value,“True”)
?@varocabas如果不确定您还需要什么,我可以输入生成
返回字符串的完整函数,但这会使Q读起来相当笨拙!如果我直接投,同样的事情也会发生!你想干什么就干什么。但这种行为无法复制。如果我写If-CBool(“True”),那么一切都很好。因此,问题在于您的具体情况,最有可能出现在您的代码中(而不是在CBool中)。如果你想得到帮助,你应该允许帮助者得到你声称的错误。但是,正如我所说的,你想做什么就做什么;我在这里已经花了足够的时间。我现在将把提取代码添加到Q中,以防有帮助!为什么
如果CBool(“False”)那么
不会抛出异常?您可以将“True”直接强制转换为布尔值,但这对返回的字符串也不起作用!它不会抛出异常,因为“true”和“false”是异常接受的字符串。如果可能,请尝试
If CBool(ReturnedString.ToString())然后)
-编辑我的回答异常接受的字符串?请您阅读原始帖子并理解问题(同时查看CBool MSDN信息)好吗?OP没有做CBool(“任何”)!,但CBool(“True”)是CBool或DirectCast(,Boolean)或执行Dim temp时发生的隐式cast的完全有效输入,为Boolean=“True”。请您更新您的答案并更正如此明显的错误,好吗?“它的参数不能是字符串”->你从哪里得到这样的想法?最好等到OP更新他的问题时,确切的问题可能会更清楚。是的,尝试
CBool(“zzz”)
,你会发现这不是一个可接受的字符串-检查它是否接受。不管怎样,我不知道你为什么这么生气,我只是想帮这个人。即使我的答案不正确或不符合他的需要,你也可以试着帮助我改进我的答案,或者试着自己回答,也许帮助提问者的目标已经实现了。愤怒?!(我是我见过的最快乐的人之一)。你能重新阅读我的评论并理解为什么CBool(“zzz”)不符合我上面所说的吗?:)(>为了证明我很高兴)谢谢你的回答,我更新了这个问题,因为当我尝试@Chiapa建议时,我发现它有时很好,但并不总是如此,所以我现在真的想找出为什么不总是如此!我真的很好奇,如果出现异常,您的返回字符串会是什么样子。你有没有看过它?它看起来像“假”或“真”没有多少。然后可能有一个空格或一个控制字符在那里?在将其放入ParserTank以获取建议之前,请查看它的字节数,但由于它在某些情况下有效,但在其他情况下无效,我很有信心说,没有-我说过我总是尝试建议,所以我会尝试并让您知道。我认为这是不言而喻的。。。唯一的问题是,在我看来,无效字符串不应转换为
False
,因为它不是
False
,而是无效的…抱歉,我收回了:)我刚刚记得TryParse在out参数中生成结果。所以没有干扰。但在我看来,这仍然是一种误导,因为操作的成功很容易与实际结果相混淆。创建一个包装Boolean.TryParse的IsTrue共享方法是很简单的,如果您认为值得付出努力,它将消除这种混淆。
Dim myxml as New MyXml
If myxml.Weekly.Flag then

End If
If CBool(ReturnedString = "True") Then
    'some code
End If
If CBool(ReturnedString.ToString()) Then
        'some code
End If
If Boolean.Parse(ReturnedString) Then
 'some code
End If