VB.NET:返回不是函数返回类型实例的对象时没有警告

时间:2015-04-06 22:21:53

标签: vb.net

我们有:

Friend NotInheritable Class ConcreteGraphFactory
    Inherits AbstractGraphFactory

    Public Shared ReadOnly Instance As New ConcreteGraphFactory()

    Private Sub New()
        MyBase.New()
    End Sub

    Friend Overrides Function Create() As AbstractGraph
        Return New ConcreteGraph()
    End Function    

    Private NotInheritable Class ConcreteGraph
        Inherits AbstractGraph

        Private ReadOnly Question1 As New Question("Why isn't this showing a warning?")

        Public Overrides Function GetRoot() As IRoot
            Return Question1 '<---HERE
        End Function

        Public Sub New()
        End Sub

    End Class

End Class

我有IRoot

Friend Interface IRoot
    Inherits IQuestion
    Function GetContainer() As AbstractGraph
End Interface

最后Question

Public Class Question 
    Implements IQuestion

    ' code....

End Class

VS为什么不显示警告? Question未实施IRoot ...

1 个答案:

答案 0 :(得分:4)

如果您希望编译器在那里给出错误,那么您需要将Option strict设置为On。您可以在项目属性的“编译”选项卡上执行此操作。或者将Option Strict On添加到包含此代码的文件的顶部。

以下是一些页面,其中详细介绍了Option Strict的含义。

http://support.microsoft.com/en-us/kb/311329

https://msdn.microsoft.com/en-us/library/zcd4xwzs.aspx

Option Strict Off表示Visual Basic编译器不强制执行严格的数据输入。如果无法完成,它将尝试进行隐式类型转换并抛出运行时错误。

我并不认为它与IRoot作为界面有任何关系,但在尝试之后看起来就像是这样。如果GetRoot返回了Question没有继承的类,那么即使关闭Option Strict也会出现编译器错误。

使用Option Strict off运行实际上使一些事情变得更容易,特别是在处理后期绑定的COM对象时。在大多数情况下,编写代码时不必担心类型转换。

然而,这也是许多人不喜欢VB.NET的原因之一。就个人而言,当我使用它时,我喜欢它,但它已经足够长了,因为编译器不会为你做所有严格的类型检查似乎很奇怪。我总能说出一些VB代码是通过C#的转换工具生成的,因为它会有一堆DirectCast调用,你不会在VB开发人员编写的代码中看到它。

当C#在2009年推出dynamic关键字时,VB.NET开发人员正在思考,&#34; Meh。我们始终能够编写代码而无需担心类型。&#34;当然,VB.NET与C#中的dynamic不同,但许多早期的动态代码示例都显示了你已经可以在VB中完成选项严格关闭的事情。