使用 CASE [String] 时 SELECT CASE 语句的奇怪行为

Posted

技术标签:

【中文标题】使用 CASE [String] 时 SELECT CASE 语句的奇怪行为【英文标题】:Strange Behavior of SELECT CASE statement when using CASE [String] 【发布时间】:2015-02-27 02:39:34 【问题描述】:

[使用真实代码更新,因此问题可重现] 我有以下声明:

<Test()>
Public Sub SelectCaseTest()
    Dim foo As String = "AccrualAmount"
    Dim result As Boolean = False

    Select Case foo
        Case "AccrualAmount"
            result = True
    End Select
    Assert.IsTrue(result)
End Sub

知道了:

  Expected: True
  But was:  False
   at NUnit.Framework.Assert.That(Object actual, IResolveConstraint expression, String message, Object[] args)
   at NUnit.Framework.Assert.IsTrue(Boolean condition)

看起来非常简单明了。出于某种原因,它没有进入选择案例。如果我在调试器中使用该问题案例执行 foo.Equals("AccrualAmount") ,则它返回 true。当 VB.NET 评估 "case "AccrualAmount" " 语句时,幕后会发生什么?为什么它与.Equals评估的结果不一致?

【问题讨论】:

如果您向我们提供更多真实代码,我们可以为您提供帮助。 我很想提供更多代码,但代码库很大,我正在寻找关于我应该注意什么的指针。我要寻找的一件事是“选项比较”。但我不明白为什么 .Equals() 返回正确答案但 select case ... 没有。有什么想法吗? @Denis 你不需要粘贴整个代码库。足以让我们重现它。正如我在下面指出的,您的示例代码不会失败。 似乎我现在可以在单元测试中重现这一点(更新了问题) 再一次,这个单元测试通过了。一定有另一个Case 使这个短路? 【参考方案1】:

您的代码中一定还有其他未在此处显示的内容。我假设这个Select...Case 语句在FunctionSub 内?因为这行得通:

.aspx页面:

<p runat="server" id="poutput"></p>

.aspx.vb代码隐藏:

Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
    If Not Page.IsPostBack Then
        Dim foo As String = example()
        poutput.InnerText = foo
    End If
End Sub

Protected Function example() As String
    Dim SomeVar As String
    SomeVar = "hello"
    Select Case SomeVar
        Case "hello"
            Return "got it"
    End Select
    Return "no match"
End Function

您还可以展示更多内容来帮助我们重现您的错误吗?

【讨论】:

你认为它使用 .equals 吗?或者它用什么来检查相等性? Here is the doc 基本上说“这取决于”...The setting of Option Compare can affect string comparisons. Under Option Compare Text, the strings "Apples" and "apples" compare as equal, but under Option Compare Binary, they do not. 但我猜还有一些其他的东西你没有展示。 你觉得我之前的问题怎么样?【参考方案2】:

检查所有“选项比较”设置后,尝试以不同方式重写它等。我不得不将单元测试复制到某个地方,所以我暂时将它放入 Notepad++。看到这个:

天哪,简直不敢相信我的运气!喜欢“案例”声明末尾的美国符号。所以这里要学习的一课是如果你看到这样奇怪的东西,就把你的代码从 VS 粘贴到 Notepad++。现在它是有道理的。一定有人从某处复制/粘贴了 case 值。看起来 US 是十六进制值 F1。现在我只需要弄清楚这是从哪里复制/粘贴的,这样就不会再发生了。

【讨论】:

任何时候复制和粘贴任何东西,它都应该通过普通的、旧的 Notepad.exe 删除可能的格式和 unicode 字符。

以上是关于使用 CASE [String] 时 SELECT CASE 语句的奇怪行为的主要内容,如果未能解决你的问题,请参考以下文章

如何根据 CASE 执行不同的 SELECT 语句

如何使用 Select Case 基于 MessageBox 输入给出输出?

switch case语句中能否作用在String,long上

select 中使用 case when 和 replace

go关键字之select

使用 case 语句从 SELECT 更新记录。 (mysql)