C# VB.NET奇怪的IF语句行为,总是else

C# VB.NET奇怪的IF语句行为,总是else,c#,.net,vb.net,clr,nullable,C#,.net,Vb.net,Clr,Nullable,我尝试了这两个块,但它返回相同的值。我不做更多描述,我只是展示代码: 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 Nullabl

我尝试了这两个块,但它返回相同的值。我不做更多描述,我只是展示代码:

    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语言中正确工作…

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

在VB中,比较f=1会产生一个布尔值为null的值。将任何值与Nothing进行比较的结果都是Nothing,Nothing和Nothing都不是True,因此您总是会在Else子句中结束

有关更多详细信息,请参阅。特别是,如果您想比较可为null的类型,您会发现一个示例,其中的解释与您的情况非常相似。特别是:

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


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

在VB中,比较f=1会产生一个布尔值为null的值。将任何值与Nothing进行比较的结果都是Nothing,Nothing和Nothing都不是True,因此您总是会在Else子句中结束

有关更多详细信息,请参阅。特别是,如果您想比较可为null的类型,您会发现一个示例,其中的解释与您的情况非常相似。特别是:

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


布尔表达式的计算结果可能为真、假或无。布尔表达式的三种状态?但是VB的IF关键字只有两种状态:Then或Else?@pylover:事实上,布尔值的null值有三种状态,不幸的是,MSDN在这一点上并不清楚。但是是的,如果值为True,则只执行If体,如果值为False或Nothing,则执行Else体。我将在IronPython中测试这种情况,FIt似乎一个布尔表达式的计算结果可能为True或False或Nothing。布尔表达式的三种状态?但是VB的IF关键字只有两种状态:Then或Else?@pylover:事实上,布尔值的null值有三种状态,不幸的是,MSDN在这一点上并不清楚。但是是的,如果值为True,If体将被执行,如果值为False或为零,Else体将被执行。我将在IronPython和FA小点中测试这种情况:不是f=1不是f=1不是f=1,但它们仍然都是空的。我发现VB.Net太脏了。为什么人们还在使用它?那么C、python、Lua、ruby呢?有些人仍然在使用它,因为他们从来没有喝过C酷炫助手,而是喝过VB/VB.NET酷炫助手!我在VB/VB.NET上建立了自己的职业生涯。我已经学会了足够多的C语言,可以将其转换回VB.NET,但我更愿意在可能的情况下不使用它。好吧,所以我必须再问一次:为什么有些人从来没有喝过C cool aid?这是聊天的理想选择,但我现在正在工作,没有时间。在我的情况下,我只是不需要:VB.NET是一个重大的变化,但在我的能力范围内。我知道其他人在更改框架时更喜欢更改语言,但我不需要这样做。一个小问题:不是f=1不是f=1不是f=1,但它们都是空的。我发现VB.Net太脏了。为什么人们还在使用它?那么C、python、Lua、ruby呢?有些人仍然在使用它,因为他们从来没有喝过C酷炫助手,而是喝过VB/VB.NET酷炫助手!我在VB/VB.NET上建立了自己的职业生涯。我已经学会了足够多的C语言,可以将其转换回VB.NET,但我更愿意在可能的情况下不使用它。好吧,所以我必须再问一次:为什么有些人从来没有喝过C cool aid?这是聊天的理想选择,但我现在正在工作,没有时间。在我的情况下,我只是不需要:VB.NET是一个重大的变化,但在我的能力范围内。我知道其他人在更改框架时更喜欢更改语言,但我不需要这样做。