我有以下功能定义:
Function Parameterless() as String
没有覆盖或重载。以下行将很乐意编译并运行:
Dim s as String = Parameterless(1)
发生了什么事?
答案 0 :(得分:8)
这里发生的事情确实很奇怪,而且VB.NET很奇怪。
使用()
调用方法和索引器(与C#相反,后者使用[]
)。由于向下兼容性,这些括号不是强制性的。您可以调用任何不带任何参数的方法。所以你可以使用:
Dim s As String = Parameterless
你可以使用(推荐这个原因)
Dim s As String = Parameterless()
但是为什么即使没有过载也可以使用Parameterless(0)
?因为该方法返回一个具有索引器的String
。因此,如果您想要返回的字符串的第一个字符,您可以使用(推荐):
Dim firstLetter As Char = Parameterless()(0)
或(不推荐,但你的情况)
Dim firstLetter As Char = Parameterless(0)
这是有效的,因为没有重载,VB.NET编译器决定你想要在没有参数的情况下调用方法,然后你想在字符串上使用索引器。
如果方法不返回字符串(或任何其他具有索引器的类型)但是例如整数,则会出现编译器错误。
答案 1 :(得分:1)
我尝试根据您的代码复制它
Private Function Parameterless() As String
Return "abcd"
End Function
我添加了一个按钮
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
Dim per As String = Parameterless(1)
TextBox1.Text = per
End Sub
文本框中显示的输出: B'/ P>
所以数字参数将决定要显示的索引字符数
答案 2 :(得分:1)
"默认"做这个技巧
Public Class User
Default ReadOnly Property Number(i As Integer) As String
Get
If i = 1 Then Return "Mark"
Return "Bob"
End Get
End Property
End Class
Private Function TestFunction () As User
Return New User
End Function
因此输出
TestFunction(1) 'Mark
TestFunction(2) 'Bob