如果我有一个类似字符串的input="AA["
If Right(input, 1) = "[" Then Do stuff
If语句返回false,即使我尝试将周围的内容转换为字符等。但如果我这样做,则返回true:
Dim temp As String = Right(input, 1)
If temp = "[" Then Do Stuff
我喜欢知道这样的语义,知道为什么会这样吗?
或者根本不要使用Right,因为这是.Net
Dim s As String = "AAAAAAA]"
If s.Substring(s.Length - 1, 1) = "]" Then
Stop
End If
'or
If s(s.Length - 1) = "]" Then
Stop
End If
我在调试时看到过类似的奇怪行为。
事实上,今天我有一些类似的东西
Dim records As Integer
records = If(o.dr Is Nothing, o.ADO.rs.RecordCount, o.ADO.DS.Tables("tbl").Rows.Count)
这应该有效,当dr为零时使用rs.RecordCount,否则使用Rows.Count。事实并非如此,记录最终为零。将其改写为完整的if-then-/else块,它就起作用了。
我从来没有想过编译器/调试器/ide会把事情搞砸,但你应该把它放在脑后考虑:编写这些程序的程序员和你我一样都是人,也一样容易出错
不应该。你确定你没有打字错误吗?RIGHT的结果是一个字符串,如果输入真的是"AA[",if就会通过。
我从来没有让VB在这样的事情上表现得不稳定。
如果代码出现在表单中,则表单的.Right属性将覆盖字符串操作函数。您需要指定父命名空间,例如VisualBasic.Right,以确保获得正确的方法。
我认为这里可能会出现某种奇怪的过载混淆。
您正在指定"Right"(可以调用本地"Right"函数)。在我的大部分代码中,您所暗示的函数是"Microsoft.VisualBasic.Strings.Right",由于全局导入,它最终变成了"Strings.Right"。
我会尝试将您的代码更改为下面的代码,看看这种情况是否仍然存在,以排除一些过载/范围混淆。(和/或减少的"Strings.Right")
If Micosoft.VisualBasic.Strings.Right(input, 1) = "[" Then Do stuff