VB.NET - 我很好奇,为什么从"Right"返回不能作为字符串工作?



如果我有一个类似字符串的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 

最新更新