为什么会有所不同?!
Public Class Form1 Public Function MyFunction() As Integer? Return Nothing End Function Private Sub Form1_Load(sender As Object,e As EventArgs) Handles MyBase.Load Dim o As Object = Me MsgBox(TypeName(Me)) ' Form1 MsgBox(TypeName(o)) ' Form1 MsgBox(TypeName(Me.MyFunction())) ' Nothing MsgBox(TypeName(o.MyFunction())) ' Nothing ' but MsgBox(TypeName(Me.MyFunction() + 0)) ' Nothing MsgBox(TypeName(o.MyFunction() + 0)) ' Integer End Sub End Class
使用Option Strict On是一种避免这种意外的好方法.你会得到一个“你想要做什么?”来自编译器的错误消息.
但是关闭它,这些是由DLR(动态语言运行时)执行的有效语句.哪个能够评估这样的后期绑定表达式.但是它有像Integer这样的可空类型的问题.它需要处理值的盒装版本.这简直就是没什么.并且没有任何类型信息与之相关. DLR没有什么可以看到这开始是一个可以为空的整数生命,因为它知道它可能是一个Nothing的字符串.
编译器也无法帮助,它不能发出任何代码使表达式遵循正常的评估规则.它只知道有一些功能,它不知道哪个,其名称是“MyFunction”,不知道它返回什么样的值.它将降压传递给DLR以对其进行排序.
因此,DLR只是支持它.它提出“不知道”0 = 0.鉴于它确实有0的类型信息.它是一个整数,所以它试图将左运算符解释为整数.哪个是有效的,Nothing是Integer的正确默认值.