我在VB.NET中学习代表,并且对代理类型感到困惑。在阅读有关委托的内容时,我了解到委托是一种数据类型,可以引用具有特定签名的方法。因此,与String可以引用字符的方式相同,委托可以引用一个方法(例如),该方法将整数作为输入并返回一个整数作为输出。但在与代表们玩耍时,我发现事实并非如此。下面的代码编译并运行 - 即使我不遵守“打字”这样的代码。在我的代表签名中。我很困惑。我错过了什么吗?
Public Delegate Function myDelegate(ByVal i As Integer) As Integer' int in, rtrn int
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Dim md As myDelegate 'should be of type int in, rtrn int
md = New myDelegate(AddressOf squared) 'allows assign to string in, string out
MsgBox(md("3"))
End Sub
Private Function squared(ByVal i As String) As String
Return i * i
End Function
答案 0 :(得分:6)
是的,VB.NET是一种强类型语言,代表也是如此。但是VB.NET从旧版本的VB继承了很多包袱,比如隐式值转换。 VB.NET编译器正在调用Microsoft.VisualBasic.Conversions.ToDouble
来“修复”冲突类型。
如果您将Option Strict On
放在.vb文件的顶部,那么您将看到预期的错误。
选项严格将隐式数据类型转换限制为仅扩展转化。明确地扩展转换不允许任何可能发生数据丢失的数据类型转换以及数字类型和字符串之间的任何转换。有关扩展转化的详细信息,请参阅“扩展转化”部分。