VB.NET中的IIF函数问题

JBo*_*one 3 .net vb.net

我正在看几行VB代码,我不知道为什么最后一个WriteLine失败.看起来好像该ToUpper()函数正在尝试被评估(如果不在字符串上调用此函数将起作用),即使条件明确地计算为false并且应该在此示例中仅输出"mydefault"硬编码字符串.我知道Nothing关键字与defaultC#中的关键字类似,但我认为问题的关键在于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
Run Code Online (Sandbox Code Playgroud)

Cra*_*son 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
Run Code Online (Sandbox Code Playgroud)

  • 没问题!IIF来自VB6天,我相信是为了保持兼容性而保留的. (2认同)
  • @OneFineDay - 我希望MS默认VB.Net为所有新项目使用Option Strict On!仅这一点就会有很大的帮助! (2认同)