2014-02-07 74 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