Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/vb.net/14.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
Vb.net if()运算符/函数错误不处理任何内容。IF()不';我什么也不回。为什么?_Vb.net - Fatal编程技术网

Vb.net if()运算符/函数错误不处理任何内容。IF()不';我什么也不回。为什么?

Vb.net if()运算符/函数错误不处理任何内容。IF()不';我什么也不回。为什么?,vb.net,Vb.net,这很可能是一个bug报告,而不是问问题,然而,如果不是这样,并且任何人都知道为什么,请解决这个悖论 函数如果(arg1、arg2、arg3)在MSDN中明智地描述的所有情况下都不起作用。当arg2为Nothing时,在特殊情况下,它不会返回Nothing,特别是arg1为TRUE(arg2为Nothing)且arg3不是可为空的类型。相反,它将Nothing转换为arg3类型(为arg2设置arg3类型的默认值),并将该值传递给arg3。下面的代码说明了该问题\问题\错误 注释暗示行为,消息标题

这很可能是一个bug报告,而不是问问题,然而,如果不是这样,并且任何人都知道为什么,请解决这个悖论

函数
如果(arg1、arg2、arg3)
在MSDN中明智地描述的所有情况下都不起作用。当
arg2
Nothing
时,在特殊情况下,它不会返回
Nothing
,特别是
arg1
TRUE
arg2
Nothing
)且
arg3
不是可为空的类型。相反,它将
Nothing
转换为arg3类型(为
arg2
设置
arg3
类型的默认值),并将该值传递给
arg3
。下面的代码说明了该问题\问题\错误

注释暗示行为,消息标题有助于遵循(如果序列丢失)

在VB.NET中有两种含义:

  • null
    (如在C#中)
  • 给定类型的默认值(
    default
    在C#中)
  • 如果将条件运算符与两种类型一起使用,则两种类型都必须相互转换。使用
    是可能的,因为
    布尔
    的默认值是

    因此,它与较长的版本相同

    Dim bool1 As Boolean = Nothing ' False
    Dim bool2 As Boolean = If(True, bool1, True)
    
    bool2
    将是
    False
    ,因为
    bool1
    False
    ,因为这是
    Boolean
    的默认值

    你从中学到了什么?小心使用
    If
    运算符和隐式转换,并始终记住
    Nothing
    在VB.NET中不仅仅意味着
    null

    还要记住,像
    Boolean
    这样的值类型总是有一个值,它们从来都不是
    null
    。在这种情况下,
    Nothing
    真正的意思是“给我默认值”

    现在做一个练习:)这里整数
    i
    的结果是什么

    Dim i AS int32 = If(true, nothing, 777)
    

    If
    运算符可以看作是一个通用函数:

    If(Of T)(condition As Boolean,
             truePart As T,
             falsePart As T) As T
    
    这意味着第二个和第三个参数必须是相同的类型(显式或一个可以转换为另一个),并且返回值将是相同的类型。考虑到这一点,让我们看看您的一些示例

    '2nd msgbox. If(D, Nothing, True) returns false instead of nothing
    MsgBox(If(D, Nothing, True), vbOK, "'2nd msgbox.")
    
    所以,要想让它发挥作用,第二个和第三个是同一类型。那可能是什么类型的?第二个参数的类型是未指定的,而第三个参数的类型是
    Boolean
    <代码>没有任何内容可以转换为类型
    布尔值
    ,因此就是这样,因此返回值也是
    布尔值
    。将
    Nothing
    转换为类型
    Boolean
    将产生
    False
    ,因此第二个参数实际上是
    False
    ,这就是返回的结果

    Dim UnevaluatedPart As Nullable(Of Integer)
    
    ' 8th. Now it returns nothing with integer? as third argument (false part)
    MsgBox(If(True, Nothing, UnevaluatedPart), vbOK, "8th. Now it returns nothing")
    
    
    ' 9th. Proof of above (it's really nothing not empty string ""
    MsgBox(If(True, Nothing, UnevaluatedPart) Is Nothing, vbOK, "' 9th. Proof of above")
    
    在这两种情况下,第二个参数的类型未指定,第三个参数的类型为
    Integer?
    ,因此
    Nothing
    被转换为type
    Integer?
    。这意味着第二个和第三个参数都是不带值的
    整数?
    。无论条件是
    True
    还是
    False
    ,您都将获得相同的返回值。当然,它不会是空的
    字符串
    ,因为返回值必须是类型
    整数?
    。这不仅仅是
    什么都没有
    ;它是一个没有值的
    整数?
    ,因此您可以实际测试该结果的
    HasValue
    属性

    ' 5th. this returns different result (int format) but again not the expected nothing
    MsgBox(If(True, Nothing, 15), vbOK, "5th.")
    
    同样,第二个参数的类型未指定,因此从第三个参数推断参数和返回类型。第三个参数是type
    Integer
    ,这意味着
    Nothing
    被转换为type
    Integer
    ,这将产生零。条件为
    True
    ,因此返回的是零值。如果您测试它是否等于
    Nothing
    ,那么您会发现它是,这就是为什么
    Nothing
    被转换为第二个参数的原因。

    “If”需要返回值,当它查看参数时,如果没有看到布尔值,它会说“哦,我应该返回一个布尔值”。如果要返回可为空的布尔值,则其中一个参数必须是布尔值?。整数也一样

        Dim a As Boolean? = If(True, Nothing, True)
        Dim b As Boolean? = If(False, Nothing, True)
        Dim c As Boolean? = If(True, Nothing, CType(True, Boolean?))
        Dim d As Boolean? = If(False, Nothing, CType(True, Boolean?))
    
        Console.WriteLine(a) ' false
        Console.WriteLine(b) ' true
        Console.WriteLine(c) ' empty
        Console.WriteLine(d) ' true
    

    如果你说的是这样的话,那么问题是“有没有一种方法可以在VB中提到单一的无意义(在C#中为null)?”。您带来的示例可以简单描述,使用标准逻辑,“bool2”将为false,因为“bool1=false”(它将获得“bool1”值,因为“arg1=true”,可能不是因为它是布尔值的默认值)。因为我这里没有任何内容,它是否检查了
    arg3
    以了解它是什么类型的
    Nothing
    ?在MSDN中,他们说如果
    arg1
    为真,则不计算
    arg3
    。@Kaihusrav:1。)您真的应该将
    选项Strict
    切换到
    On
    ,无论何时何地。您将学到很多关于.NET类型系统的知识,以及如何编写安全可读的代码。2.)当然,
    bool2
    将为false,因为
    bool1
    为false。但是
    bool1
    为false,因为
    Nothing
    在这里表示
    default(Boolean)
    。否则将无法编译,因为
    Boolean
    是值类型,而不是可为null的引用类型。在C#中,您不能将
    null
    赋值给
    bool
    变量,在VB中,您可以赋值,因为它也是默认运算符。如何确定“给定类型”?你能检查一下第四个msgbox的情况吗。变量
    V
    为可空类型。多谢各位@Kaihusrav:第四个消息框是没有意义的,因为这实际上是一个很好的例子,说明了为什么应该将
    选项Strict
    设置为
    On
    。这不应该编译,也不应该:“Option Strict On不允许从‘Boolean’到‘Integer’的隐式转换?”这是无效的:
    Dim V As Int32?=如果(True,Nothing,True)
    。塔格
        Dim a As Boolean? = If(True, Nothing, True)
        Dim b As Boolean? = If(False, Nothing, True)
        Dim c As Boolean? = If(True, Nothing, CType(True, Boolean?))
        Dim d As Boolean? = If(False, Nothing, CType(True, Boolean?))
    
        Console.WriteLine(a) ' false
        Console.WriteLine(b) ' true
        Console.WriteLine(c) ' empty
        Console.WriteLine(d) ' true