使用VB.Net中的函数接口参数键入检查乐趣

时间:2012-03-04 14:12:19

标签: .net compiler-construction interface parameters typechecking

当其中一个参数是接口时,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的后期版本中修复的吗?

1 个答案:

答案 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。