首页 > 解决方案 > 在 VB.NET 中,对象引用周围的括号到底是做什么的?

问题描述

我有一些将Control对象引用作为参数的程序。

在我的项目中,我有一堆Control不同派生类型的 s,例如Button, TextBox, PictureBox,ListBox等。

我正在调用该过程并正常传递引用:

Procedure(controlRef)

我更改了项目配置中的一些警告通知。我猜它正在将隐式转换通知从“无”更改为“警告”,导致在调用这些程序的任何地方都会出现类似于以下内容的警告:

“在将 'ByRef' 参数 'parControl' 的值复制回匹配的参数时,从 'Control' 到 'Button' 的隐式转换。”

这是有道理的,我正在做一个隐式转换,但稍等一下,我将 a Buttonin 传递给一个参数Control,而不是像它所说的那样,我有点困惑这里发生了什么。ControlButton

无论如何,我看一下“显示潜在修复”并没有修复建议,只有抑制或配置选项,好吧。所以我做了一个显DirectCast(controlRef, Control)式转换,看看这是否会删除隐式转换的警告,它确实如此,但它被一个冗余转换警告取代,再次,这是有道理的。所以我使用潜在的修复删除了演员表,过程调用中的参数在它周围留下了括号,没有更多的警告。

Procedure((controlRef))

这里到底发生了什么?

标签: vb.netcasting

解决方案


由于Procedureis的签名Sub Procedure(ByRef param As Control)并且您将 a 传递Button给该方法,因此编译器正确地警告您有关隐式转换。

想象一下这是 的定义Procedure

Sub Procedure(ByRef param As Control)
    param = New Label()
End Sub

如果你这样称呼它:

Dim button = New Button()
Procedure(button)

然后你有效地调用这个代码:

Dim button As Button = New Button()
button = New Label()

因此编译器警告。

如果将签名更改为,Sub Procedure(ByVal param As Control)则不可能将分配回调用变量,并且警告将消失。

使用额外的括号会强制调用ByVal而不是ByRef. 请参阅https://docs.microsoft.com/en-us/dotnet/visual-basic/programming-guide/language-features/procedures/how-to-force-an-argument-to-be-passed-by-value


推荐阅读