2014-02-07 108 views
4

我目前使用VB.NET,並且遇到了一個問題。這是我的課程:能夠將參數傳遞給不帶參數的函數

Public class foo 

    Private _bar As Integer 
    Private _name As String 

    Public Sub New(bar As Integer) 
     Me._bar = bar 
     Me._name = getName(bar) '//Passing in an argument where it is not needed 
    End Sub 

    Private Function getName() As String 

     '//Get name from database using _bar as a lookup(it's essentially a primary key) 
     '//Name is obtained successfully (checked when debugging) 
     '//Return name 

    End Function 

End Class 

儘管傳入參數給getName,但它沒有參數,我能夠運行此代碼。但是,當我運行它時,Me._name字段總是以空字符串結尾(不是空值,因爲它最初開始時爲),但我知道getName方法正在返回正確的字符串,因爲我在調試過程中檢查了它。如果我刪除不需要的參數,則它按預期工作,並且Me._name獲取返回的值。

爲什麼我能夠通過一個參數,不應該有一個參數,並且不會在我的錯誤列表中顯示任何錯誤?我在同事電腦上試過這個,他們得到了「太多爭論」的錯誤。

+1

看起來很奇怪..我也能夠複製這個..沒有錯誤。等待gud的解釋.. –

+0

我認爲這可能與我在同一個解決方案中另一個項目中的另一個類中使用的共享(靜態)方法有關。但更改共享方法的名稱後,問題依然存在。 – BenM

+0

這是像預定義的超載功能..但仍然很奇怪,因爲返回類型是Char –

回答

6

我們可以調用的函數/子帶或不帶括號VB.NET,所以這

getName(bar) 

其實也是一樣的,因爲這

getName()(bar) 

,這就是爲什麼沒有錯誤。

此外,getName(bar)將無法​​通過bar作爲參數傳遞給getName功能,但將返回getName()返回值的(bar+1)th字符。

例如,如果我們改變getName函數將此

Private Function getName() As String 
    Return "test" 
End Function 

然後getName(1)將相同getName()(1),它將返回的"test"第二個字符,這是"e"

+0

哇,這是眼睛開放。我不知道!這是否也發生在C#中,你知道嗎? – BenM

+0

這不會發生在C#中。當你在C#中調用一個函數時,你必須在最後加上括號,所以如果你的代碼在C#中,你會得到一個錯誤,你將無法編譯。 – ekad

2

CharsString類的默認屬性。

Public NotInheritable Class [String] 

    <__DynamicallyInvokable> _ 
    Public ReadOnly Default Property Chars(ByVal index As Integer) As Char 
     <MethodImpl(MethodImplOptions.InternalCall), SecuritySafeCritical, __DynamicallyInvokable> _ 
     Get 
    End Property 

End Class 

這就是爲什麼你可以撥打:

getName(bar) 

這是相當於

​​

現在,如果String類沒有任何默認屬性,你會得到一個錯誤的說法Expression is not an array or a method, and cannot have an argument list..

Public Class foo 

    Private _bar As Integer 
    Private _name As [String] 

    Public Sub New(bar As Integer) 
     Me._bar = bar 
     Me._name = getName(bar) '//Passing in an argument where it is not needed 
    End Sub 

    Private Function getName() As [String] 
     '//Get name from database using _bar as a lookup(it's essentially a primary key) 
     '//Name is obtained successfully (checked when debugging) 
     '//Return name 
    End Function 

End Class 

Public NotInheritable Class [String] 

    Public ReadOnly Property Chars(index As Integer) As Char 
     Get 

     End Get 
    End Property 

End Class