Vb.net if()运算符/函数错误不处理任何内容。IF()不';我什么也不回。为什么?
这很可能是一个bug报告,而不是问问题,然而,如果不是这样,并且任何人都知道为什么,请解决这个悖论 函数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。下面的代码说明了该问题\问题\错误 注释暗示行为,消息标题
如果(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
被转换为typeInteger?
。这意味着第二个和第三个参数都是不带值的整数?
。无论条件是True
还是False
,您都将获得相同的返回值。当然,它不会是空的字符串
,因为返回值必须是类型整数?
。这不仅仅是什么都没有
;它是一个没有值的整数?
,因此您可以实际测试该结果的HasValue
属性
' 5th. this returns different result (int format) but again not the expected nothing
MsgBox(If(True, Nothing, 15), vbOK, "5th.")
同样,第二个参数的类型未指定,因此从第三个参数推断参数和返回类型。第三个参数是typeInteger
,这意味着Nothing
被转换为typeInteger
,这将产生零。条件为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