我有以下函數定義:VB.Net參數方法似乎是接受參數
Function Parameterless() as String
沒有覆蓋或它的過載。以下行將愉快地編譯和運行:
Dim s as String = Parameterless(1)
這是怎麼回事?
我有以下函數定義:VB.Net參數方法似乎是接受參數
Function Parameterless() as String
沒有覆蓋或它的過載。以下行將愉快地編譯和運行:
Dim s as String = Parameterless(1)
這是怎麼回事?
這裏發生的事情確實很奇怪,並且是一個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編譯器決定你想調用沒有參數的方法,然後你想在字符串上使用索引器。
如果該方法不會返回一個字符串(或任何其他具有索引器的類型),但是例如一個整數,則會出現編譯器錯誤。
我試圖根據你的代碼
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會有確定的字符的索引號
「默認」做這一招
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
奇蹟V b ...:-) – Oscar
你確定你沒有超載/遮蔽/覆蓋部分類中的函數嗎?我的Visual Studio告訴我「太多參數」。 – muffi
切換到更可靠和更嚴格的c# – Kokombads