Vb.net委托是强类型/为什么编译器接受这个'松散类型'委托?

ber*_*436 4 vb.net delegates programming-languages

我正在学习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
Run Code Online (Sandbox Code Playgroud)

vcs*_*nes 6

是的,VB.NET是一种强类型语言,代表也是如此.但是VB.NET从旧版本的VB继承了很多包袱,比如隐式值转换.VB.NET编译器正在发出调用Microsoft.VisualBasic.Conversions.ToDouble以"修复"冲突类型的调用.

如果您放在Option Strict On.vb文件的顶部,那么您将看到您期望的错误.

Option Strict将隐式数据类型转换限制为仅扩展转换.明确地扩展转换不允许任何可能发生数据丢失的数据类型转换以及数字类型和字符串之间的任何转换.有关扩展转化的详细信息,请参阅"扩展转化"部分.

参考