2017-10-10 54 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 
相關問題