我正在查看几行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
答案 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