【问题标题】:Are Vb.net delegates strongly typed/Why does the compiler accept this 'loosely typed' delegate?Vb.net 委托是强类型的/为什么编译器接受这个“松散类型”的委托?
【发布时间】:2011-12-14 15:45:18
【问题描述】:

我正在学习 VB.NET 中的委托,但对委托类型感到困惑。在阅读委托时,我了解到委托是一种数据类型,可以引用具有特定类型签名的方法。因此,就像字符串可以引用字符一样,委托可以引用一个方法(例如),该方法将整数作为输入并返回整数作为输出。但在与代表们玩耍时,我发现情况并非如此。下面的代码编译并运行——即使我不遵守我的委托签名中的“打字”。我很困惑。我错过了什么吗?

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

【问题讨论】:

  • 你有Option Strict On吗?
  • 我要问和@SLaks一样的问题...
  • Option Strict On,在选项对话框中将其更改为 VB 项目的默认值:msdn.microsoft.com/en-us/library/t0k7484c.aspx
  • 啊哈!做到了。谢谢。
  • 注意微软 - 请默认 Option Strict On inn Visual Studio。 VB.NET 开发人员注意 - 确保您默认 Option Strict On(并为所有现有项目打开它)

标签: vb.net programming-languages delegates


【解决方案1】:

是的,VB.NET 是一种强类型语言,委托也是。但是 VB.NET 从旧版本的 VB 中继承了很多包袱,例如隐式值转换。 VB.NET 编译器正在发出对 Microsoft.VisualBasic.Conversions.ToDouble 的调用以“修复”冲突类型。

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

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

Reference

【讨论】:

猜你喜欢
  • 2011-12-15
  • 1970-01-01
  • 1970-01-01
  • 2011-04-09
  • 2015-05-28
  • 1970-01-01
  • 1970-01-01
  • 2023-03-05
  • 1970-01-01
相关资源
最近更新 更多