我们有:
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
...
答案 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中完成选项严格关闭的事情。