VB.NET中的IIF函数问题

时间:2015-04-08 19:28:10

标签: .net vb.net

我正在查看几行VB代码,并且不确定为什么最后WriteLine失败了。似乎ToUpper()函数正在尝试进行求值(如果不在字符串上调用此函数将会起作用),即使条件明确地计算为false并且应该在此示例中仅输出“mydefault”硬编码字符串。我知道Nothing关键字与C#中的default类似,但我认为问题实际上在于IIF函数如何评估它的树。

有没有人知道此代码抛出NullReferenceException的原因?

Module Module1
    Sub Main()
        Dim x As String = "a"
        Console.WriteLine(String.Format("y:{0}", IIf(String.IsNullOrEmpty(x) OrElse x Is Nothing, "mydefault", x.ToUpper())))

        Dim y As String = String.Empty
        Console.WriteLine(String.Format("z:{0}", IIf(String.IsNullOrEmpty(y) OrElse y Is Nothing, "mydefault", y.ToUpper())))

        Dim z As String = Nothing
        Console.WriteLine(String.Format("x:{0}", IIf(String.IsNullOrEmpty(z) OrElse z Is Nothing, "mydefault", z.ToUpper())))

        Console.ReadLine()
    End Sub
End Module

1 个答案:

答案 0 :(得分:6)

IIF是一个遗物,并按照您的描述评估这两个条件。请尝试使用If。

Module Module1
    Sub Main()
        Dim x As String = "a"
        Console.WriteLine(String.Format("y:{0}", If(String.IsNullOrEmpty(x) OrElse x Is Nothing, "mydefault", x.ToUpper())))

        Dim y As String = String.Empty
        Console.WriteLine(String.Format("z:{0}", If(String.IsNullOrEmpty(y) OrElse y Is Nothing, "mydefault", y.ToUpper())))

        Dim z As String = Nothing
        Console.WriteLine(String.Format("x:{0}", If(String.IsNullOrEmpty(z) OrElse z Is Nothing, "mydefault", z.ToUpper())))

        Console.ReadLine()
    End Sub
End Module