编译时间v运行时异常

时间:2014-06-22 11:19:23

标签: vb.net

请参阅以下代码:

Public Class Student

End Class

Public Class Undergraduate
    Inherits Student

    Public Sub Test(ByVal o As Object, ByVal s As Student)
        o.Hello() 'Line 8
        s.Hello() 'Line 9

    End Sub
End Class

第8行在运行时抛出异常,即缺少成员异常。第9行产生编译时错误,即Hello不是Student的成员。为什么第8行没有抛出编译时异常。

4 个答案:

答案 0 :(得分:1)

因为o在运行时可能是Student类型。每个班级都可以投放到Object

答案 1 :(得分:0)

Public Class Student

    Public Overridable Sub Test()
        Console.WriteLine("Hello, I am a student.")

    End Sub

End Class

Public Class Undergraduate
    Inherits Student

    Public Overrides Sub Test()
        MyBase.Test    ' skip this if this class COMPLETELY
                       ' replaces the base class functionality
        Console.WriteLine("...and I am an undergrad.")

    End Sub
End Class

Dim a As New Student
Dim b As New Undergraduate

a.Test
b.Test

输出:

Hello, I am a student      ' from a
Hello, I am a student      ' from b's MyBase.Test
...and I am an undergrad.  ' from b

您的问题与后期绑定有关。通过传递o as Object,IDE无法判断Hello方法是否在给定对象上可用。它可能是,也可能不是。如果您有Option Strict On,则默认设置将不允许此编译,因为这个原因。如果您确定自己知道自己在做什么,则可以自定义错误以将“后期绑定错误”更改为警告,甚至可以忽略它们。

重构的代码可以提供更好的使用继承类的视图,以避免需要使用后期绑定,因为将对象传递给自身有点奇怪。

答案 2 :(得分:0)

我最后一次使用后期绑定是在C#中。我发现Visual Basic似乎是一个例外,如下所述:

" 只要变量是Object类型和编译器指令" Option Strict Off" Visual Basic就会使用它们。生效了 "

来源维基百科:http://en.wikipedia.org/wiki/Late_binding#Late_binding_in_.NET

答案 3 :(得分:0)

因为您忘记了turn Option Strict On

实际上,这是在创建一个新的VB.NET项目时应该做的第一件事,而且默认情况下没有启用它真的很糟糕。

可以在MSDN上找到使用Option Strict On添加编译时检查的列表: