2017-10-10 76 views
3

我有以下函数定义:VB.Net参数方法似乎是接受参数

Function Parameterless() as String 

没有覆盖或它的过载。以下行将愉快地编译和运行:

Dim s as String = Parameterless(1) 

这是怎么回事?

+0

奇迹V b ...:-) – Oscar

+2

你确定你没有超载/遮蔽/覆盖部分类中的函数吗?我的Visual Studio告诉我“太多参数”。 – muffi

+0

切换到更可靠和更严格的c# – Kokombads

回答

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

因此数字PARAM会有确定的字符的索引号

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