我正在看几行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)
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)
| 归档时间: |
|
| 查看次数: |
102 次 |
| 最近记录: |