请参阅以下代码:
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行没有抛出编译时异常。
答案 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添加编译时检查的列表: