【问题标题】:VB.NET strange IF statement behavior, always elseVB.NET 奇怪的 IF 语句行为,总是其他
【发布时间】:2012-05-12 14:05:50
【问题描述】:

我已经尝试了这两个块,但它返回相同的值。我不再赘述,我只是展示代码:

    Dim f As Nullable(Of Integer)
    If f = 1 Then
        Console.WriteLine("Equal")
    Else
        Console.WriteLine("Not Equal")
    End If

它提示我“不相等”

我只是添加了一个NOT,我希望得到NOT答案,但我得到的和上面一样!!!

    Dim f As Nullable(Of Integer)
    If Not f = 1 Then
        Console.WriteLine("Equal")
    Else
        Console.WriteLine("Not Equal")
    End If

它可以在 C# 中正确运行...

【问题讨论】:

  • 一个小问题:Not f = 1(Not f) = 1 不是 Not (f = 1),但它们仍然是 Nothing
  • 我发现 VB.Net 太脏了。为什么人们还在使用它? C#,python,Lua,ruby 怎么样?
  • 有些人“仍在使用它”,因为他们从未喝过 C# Cool-aid,但确实喝过 VB/VB.NET cool-aid!我在 VB/VB.NET 上建立了自己的职业生涯。我已经学习了足够多的 C# 来将其转换回 VB.NET,但我宁愿尽可能不使用它。
  • 好的,所以我必须再问一遍:为什么有些人从不喝c#cool-aid?
  • 现在这变得非常适合聊天(但我现在正在工作,没有时间)。就我而言,我只是不需要:VB.NET 是一个重大变化,但在我的能力范围内。我了解其他人在更改框架时更喜欢更改语言,但我不需要。

标签: c# .net vb.net clr nullable


【解决方案1】:

TL;DR:它根据为 VB 指定的行为正常工作,这与为 C# 指定的行为不同。

比较“f = 1”在 VB 中产生Nullable(Of Boolean)。将任何值与 Nothing 进行比较的结果是 Nothing,Nothing 和“Not Nothing”都不是“True”,所以你总是会在 Else 子句中结束。

有关详细信息,请参阅MSDN page for nullable value types in VB。特别是,如果您查找“比较可空类型”,您会发现一个与您的情况非常相似的示例(带有解释)。特别是:

当布尔变量或表达式的值为 Nothing 时,它既不是真也不是假。

【讨论】:

  • 似乎布尔表达式的计算结果可能为(True or False or Nothing)。布尔表达式的三种状态?但是 VB 的 IF 关键字只有两种状态: Then Or Else ?
  • @pylover:实际上,Nullable(Of Boolean) 有三个状态 - 不幸的是,MSDN 并不清楚这一点。但是是的,“If”主体只会在值为 True 时执行,而“Else”主体将在值为 False 或 Nothing 时执行。
  • 我将在 IronPython 和 F# 中测试这种情况
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-09-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多