首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >编译时v运行时异常

编译时v运行时异常
EN

Stack Overflow用户
提问于 2014-06-22 19:19:23
回答 4查看 70关注 0票数 0

请参考下面的代码:

代码语言:javascript
运行
复制
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行不抛出编译时异常。

EN

回答 4

Stack Overflow用户

发布于 2014-06-22 19:24:42

因为o在运行时可能是Student类型。每个类都可以强制转换为Object

票数 1
EN

Stack Overflow用户

发布于 2014-06-22 20:54:16

代码语言:javascript
运行
复制
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

输出:

代码语言:javascript
运行
复制
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,集成开发环境不能判断Hello方法在给定对象上是否可用。它可能是,也可能不是。如果您有Option Strict On,那么默认设置将不允许编译它,原因就在于此。如果您确信自己知道自己在做什么,则可以自定义错误以将Late Binding errors更改为warnings,甚至忽略它们。

重构后的代码可以更好地说明如何使用继承的类,以避免需要使用后期绑定,并且因为将对象传递给对象本身有点奇怪。

票数 0
EN

Stack Overflow用户

发布于 2014-06-22 21:04:03

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

只要变量的类型为Object并且编译器指令"Option Strict Off“生效,Visual Basic就会使用它们

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24350709

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档