vb.net – 在Visual Basic.Net中添加零到零之间的区别?

为什么会有所不同?!
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的正确默认值.

功能,而不是错误.

相关文章

Format[$] ( expr [ , fmt ] ) format 返回变体型 format$ 强制返回为文本 --------------------------...
VB6或者ASP 格式化时间为 MM/dd/yyyy 格式,竟然没有好的办法, Format 或者FormatDateTime 竟然结果和...
在项目中添加如下代码:新建窗口来显示异常信息。 Namespace My ‘全局错误处理,新的解决方案直接...
转了这一篇文章,原来一直想用C#做k3的插件开发,vb没有C#用的爽呀,这篇文章写与2011年,看来我以前没...
Sub 分列() ‘以空格为分隔符,连续空格只算1个。对所选中的单元格进行处理 Dim m As Range, t...
  窗体代码 1 Private Sub Text1_OLEDragDrop(Data As DataObject, Effect As Long, Button As Integ...