当其中一个参数是接口时,Visual Studio似乎停止检查函数参数。
请考虑以下事项:
' An interface and the class that implements it:
Public Interface IA
End Interface
Public Class A
Implements IA
End Class
' Another reference type for the demonstration:
Public Class MyReferenceType
End Class
' A function that uses IA as the type of one of its parameters:
Private Function SomeFunc(ByVal a As IA, ByVal r As MyReferenceType)
Return Nothing
End Sub
以下是类型检查问题的示例:
Private Sub Example()
Dim a As IA = New A
Dim r As New MyReferenceType
' Some other random reference type, choose any
' other reference type you like
Dim list As New List(Of String)
' Each of these calls to SomeFunc compile without errors.
SomeFunc(r, r)
SomeFunc(r, a)
SomeFunc(list, r)
SomeFunc(list, a)
' Does not compile due to type mismatch
'SomeFunc(list, list)
End Sub
正如我的评论所示,此代码编译良好,编辑器中也没有错误。如果我执行程序虽然我得到System.InvalidCastException
,这根本不是一个惊喜。我想这是编译器中的类型检查错误?我正在使用Visual Studio 2005,这是在VS的后期版本中修复的吗?
答案 0 :(得分:1)
我相信这是因为你已经Option Strict了。如果你打开Option Strict,你的代码将无法编译,完全符合我们的期望。
请注意:
SomeFunc(list, a)
不是这样的:
SomeFunc(list, list)
在第一种情况下,当Option Strict关闭时,编译器会为您有效地插入强制转换。毕竟,IA
类型的值可以是MyReferenceType
。
在第二种情况下,List(Of String)
的值不能永远与MyReferenceType
兼容(有Nothing
值的可论证例外... ),即使关闭Option Strict,编译也会失败。编译器不会让你尝试一些无法工作的东西。
故事的道德:为了更好的类型检查,请打开Option Strict。