VB.Net的无参数方法似乎接受了参数

3

我有以下函数定义:

Function Parameterless() as String

没有对它进行覆盖或重载。以下代码行可以愉快地编译和运行:

Dim s as String = Parameterless(1)

发生了什么事情?


Vb的奇妙之处... :-) - Oscar
2
你确定你没有在部分类中重载/隐藏/覆盖函数吗?我的Visual Studio告诉我“参数太多了”。 - muffi
转换到更可靠和更严格的C#。 - Kokombads
5
@Kokombads: 这里有些奇怪的建议。伙计们,专注于这个问题,而不是建议改用英语而不是法语。否则请不要发表评论。 - Tim Schmelter
3个回答

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
我尝试根据您的代码进行复制。
 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
因此,数字参数将确定要显示的字符的索引号。

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接