函数返回值与调用 - 应该发生什么?

时间:2014-11-19 19:01:16

标签: vb.net

假设我有两个这样的重载:

Public Function MyTest(i As Integer) As SomeType
    classField_i = i
    Return MyTest
End Function

Public Function MyTest As SomeType
    Return New SomeType()
End Function

我在调用第一个重载时所期望的是SomeType的一个实例,但是,我得到的是Nothing。原因似乎是,编译器选择评估尚未设置的内部声明的变量MyTest,而不是调用niladic重载。

所以这表明我应该声明第一个这样的函数:

Public Function MyTest(i As Integer) As SomeType
    classField_i = i
    Return MyTest()
End Function

但在VB.Net中,不需要函数调用的括号!所以这似乎是一个奇怪的异常现象,编译器以意想不到的方式解决了歧义。

这种行为究竟是什么原因?

*编辑I *

在我的原始帖子中,我指定了Integer作为函数的返回值,正如Plutonix指出的那样,永远不会返回Nothing。我修复它以返回SomeType的对象,因为它在实际代码中

1 个答案:

答案 0 :(得分:4)

在内部函数中,VB使用函数名作为返回值的变量。

而不是

Public Function MyTest As Integer
    Return 3
End Function

你可以写

Public Function MyTest() As Integer
    MyTest = 3
End Function

在您的函数中,您实际上是返回该变量而不是调用函数。试试这个,你可能会理解发生了什么。

Public Function MyTest(ByVal i As Integer) As Integer
    MyTest = 4
    Return MyTest
End Function

不要冒任何机会,并在调用子或函数时始终使用()。

如果你真的想省略(),那就用我吧。由于局部变量在类具有相同名称时优先于类中的任何声明。

Public Function MyTest(i As Integer) As Integer
    classField_i = i
    Return Me.MyTest
End Function