vb.net - 在 VB.NET 中,对象引用周围的括号到底是做什么的?
问题描述
我有一些将Control
对象引用作为参数的程序。
在我的项目中,我有一堆Control
不同派生类型的 s,例如Button
, TextBox
, PictureBox
,ListBox
等。
我正在调用该过程并正常传递引用:
Procedure(controlRef)
我更改了项目配置中的一些警告通知。我猜它正在将隐式转换通知从“无”更改为“警告”,导致在调用这些程序的任何地方都会出现类似于以下内容的警告:
“在将 'ByRef' 参数 'parControl' 的值复制回匹配的参数时,从 'Control' 到 'Button' 的隐式转换。”
这是有道理的,我正在做一个隐式转换,但稍等一下,我将 a Button
in 传递给一个参数Control
,而不是像它所说的那样,我有点困惑这里发生了什么。Control
Button
无论如何,我看一下“显示潜在修复”并没有修复建议,只有抑制或配置选项,好吧。所以我做了一个显DirectCast(controlRef, Control)
式转换,看看这是否会删除隐式转换的警告,它确实如此,但它被一个冗余转换警告取代,再次,这是有道理的。所以我使用潜在的修复删除了演员表,过程调用中的参数在它周围留下了括号,没有更多的警告。
Procedure((controlRef))
这里到底发生了什么?
解决方案
由于Procedure
is的签名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
推荐阅读
- python - Docker ModuleNotFoundError 即使此模块不再包含在代码中
- pandas - 尝试制作条形图时获取“'函数'对象不可迭代”
- node.js - nodejs v13.10.1 安装在高山上
- gnuplot - 求和 - Gnuplot 表达式
- python - 通过匹配日期将 2 个数据框列合并为一个
- java - 超类和子类中几乎相同的方法发生冲突。为什么?
- php - Laravel Eloquent 失败了两个关系之间的联合
- c# - 斜扣也在 json 文件中创建时间跨度类
- ios - 如何在 iOS Swift 5 中启用来自应用设置的推送通知?
- java - 忽略 Spring REST WS 中的接受标头