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 如何将字符串值用作布尔值_.net_Vb.net_String_Visual Studio_Boolean - Fatal编程技术网

.net 如何将字符串值用作布尔值

.net 如何将字符串值用作布尔值,.net,vb.net,string,visual-studio,boolean,.net,Vb.net,String,Visual Studio,Boolean,我在VB.NET(Visual Studio IDE)中玩代码时,意识到我可以将布尔值转换成字符串 因此字符串的值为“True”或“False” 然后我尝试将其用作布尔值,例如 如果StringValueContainingTrue或False,则 “做点什么 如果 这也起到了作用,并取得了预期的效果。这让我意识到,我对背景中的工作原理知之甚少 是否检测到字符串中的单词True,IDE是否足够聪明来处理它,或者它只是尝试将值转换为它需要的值(因此知道它需要一个布尔值,尝试将字符串转换为一个值来执

我在VB.NET(Visual Studio IDE)中玩代码时,意识到我可以将布尔值转换成字符串

因此字符串的值为“True”或“False”

然后我尝试将其用作布尔值,例如

如果StringValueContainingTrue或False,则
“做点什么
如果

这也起到了作用,并取得了预期的效果。这让我意识到,我对背景中的工作原理知之甚少

是否检测到字符串中的单词True,IDE是否足够聪明来处理它,或者它只是尝试将值转换为它需要的值(因此知道它需要一个布尔值,尝试将字符串转换为一个值来执行其操作)


发生了什么使这成为可能?

VB希望If块中有一个布尔值,因此它会自动尝试使用隐式转换将表达式转换为布尔值

布尔类型转换识别真/假字符串并正确解析它们

这通常被认为是有风险的。尝试添加

Option Strict On
另请参见VB.Net If语句的MSDN文档:

所需条件。表情。必须评估为真或假,或 隐式转换为布尔值的数据类型


不是IDE在做,而是在从一种类型转换到另一种类型。如果字符串包含一个可以转换为布尔值的值,则可以。否则,您将得到一个运行时错误


我建议改为使用
选项Strict On
来获取编译时错误,这样您就不会无意中依赖于您不知道的运行时强制转换。如果启用此选项,问题中的代码将无法编译。

当在If语句中使用非布尔表达式时,Vb.Net编译器将使用方法将表达式转换为布尔表达式

您的代码等于

If Conversions.ToBoolean(StringValueContainingTrueOrFalse) then
    'Do Something
End if
如果您的值可以转换为布尔值,则一切正常。否则将抛出异常

例如:

Sub Main
    Dim StringValueContainingTrueOrFalse as String = "True"

    IF StringValueContainingTrueOrFalse then
    Console.WriteLine("true")
    end if  
End Sub
上述程序生成以下IL:

IL_0000:  ldstr       "True"
IL_0005:  stloc.0     // StringValueContainingTrueOrFalse
IL_0006:  ldloc.0     // StringValueContainingTrueOrFalse
IL_0007:  call        Microsoft.VisualBasic.CompilerServices.Conversions.ToBoolean
IL_000C:  brfalse.s   IL_0018
IL_000E:  ldstr       "true"
IL_0013:  call        System.Console.WriteLine
IL_0018:  ret

您可以看到标签IL_0007显示了对
Conversions.ToBoolean
方法的调用。

当字符串直接用于
if
语句时,它将尝试将其转换为布尔值,以便执行计算。“True”或“False”可以转换为布尔值,但其他值不能

Module Module1
    Sub Main()
            Dim StringValueContainingTrueOrFalse As String = "True"
        If StringValueContainingTrueOrFalse Then
            Console.WriteLine(StringValueContainingTrueOrFalse)
        End If

        Console.ReadLine()
    End Sub
End Module
结果:

因此,为了回答你关于正在发生什么的问题,有一个“幕后”的转换正在发生


您还可以使用整数(0/1)和位(0/1)值,这些值可以正确转换为布尔值。我接受了您的回答,因为它很好地解释了我想知道的“幕后”问题。然而,如果你能像其他人一样在你的答案中添加选项Strict,我觉得这将是一个更好的全面解释。谢谢你的邀请clarifications@micbobo我不知道该选项的细节。老实说,我是一名c#开发者。我相信未来的读者一定会阅读我们的评论和其他答案。我不必在回答中重复它。顺便说一句,我不喜欢在我的答案中添加我不完全理解的内容。