在没有参数的函数中传递参数

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字段总是以空字符串结束(初始值为null),但是我知道getName方法返回正确的字符串,因为我在调试期间检查了它。如果我删除多余的参数,那么它会按预期工作,Me._name将获得返回的值。
为什么我能够在不应该有参数的情况下传递参数,并且没有收到任何错误提示?我在同事的计算机上尝试了这个操作,他们收到了“参数过多”的错误提示。

1
看起来很奇怪..我也能复制这个问题..没有错误。等待一个好的解释.. - Sarvesh Mishra
我认为这可能与我在同一解决方案中不同项目的另一个类中具有相同名称的共享(静态)方法有关。但是,更改共享方法的名称后问题仍然存在。 - BenM
这类似于预定义的重载函数,但返回类型为Char,仍然很奇怪。 - Sarvesh Mishra
2个回答

7
我们可以在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"


哇,这真是大开眼界。我完全不知道!你知道在C#中也会发生这种情况吗? - BenM
这在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) 

这相当于什么?

getName.Chars(bar)

现在,如果String类没有任何默认属性,你会收到一个错误,说表达式不是数组或方法,并且不能有参数列表..
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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接