当函数没有返回时,VB.NET中没有警告

时间:2010-02-25 21:37:51

标签: vb.net warnings

关于警告的

Some comments on Stack Overflow question Why doesn't the C# compiler stop properties from referring to themselves?让我思考了在编写更多VB.NET代码时总是困扰我的旧问题。

其中一个原因是,如果您声明了一个Function但编译器没有发出警告,但从未执行过显式的Return语句或分配给Function函数。运行Visual Studio 2008,我刚刚做了一个小实验项目,似乎从未修复过该行为。我创建了一个Visual Basic控制台应用程序,其代码如下:

Module MainModule

    Sub Main()

        Dim test As Boolean = TestWarning()

    End Sub

    Function TestWarning() As Boolean

        Console.WriteLine("There is no Return Statement")

    End Function

End Module

我也进入了“项目设置”并转为On Option StrictOption Explicit。我还设置了警告配置,以便“没有返回值的函数/运算符”设置为错误。

我编译了项目并没有得到警告,并且TestWarning()函数没有错误。这似乎是一个发出警告的好地方,因为它默认为False,你可能只是忘了做一个回报。如果没有return语句,C#将会出错。我认为VB.NET对“没有返回值的函数/运算符”配置做了同样的事情。这是一个错误,还是我缺少的东西?

进一步的实验

Function TestWarning() As Boolean

    If DateTime.Now.DayOfWeek = DayOfWeek.Monday Then
        Return False
    Else
        Console.WriteLine("There is no Return Statement")
    End If

End Function

如果我在Return中有明确的If,而Else中没有任何内容,则也没有警告或错误。它将简单地采用默认值,即使您可能(通过编程风格)有明确的返回。在这种情况下,我明确地返回False(这是布尔值的默认值),因此它可能是我应该在True中返回Else的隐藏错误。

5 个答案:

答案 0 :(得分:8)

警告只会告诉您默认情况下函数何时返回Nothing

如果返回值属于引用类型,您将收到警告。

但是你的函数有一个值类型的返回值,那些不能是Nothing。因此,没有警告。

这是因为这个函数内的函数名作为结果变量。您可以通过将值分配给函数名称而不是使用Return来返回值。所有变量都使用默认值初始化,包括function-name变量。 C中不是这种情况,因此警告的含义不同。

在初始化之前将其与使用变量进行比较:

Dim x As Integer
CallFunction(x)  'No warning, x is implicitly and properly initialized to 0.

Dim y as Object
CallFunction(y)  'A warning: variable used before a value is assigned to it

答案 1 :(得分:6)

它是BASIC语言的一部分。所有基本功能都有返回类型。如果未指定返回类型,则假定类型为 object

因此编译器无法警告您缺少返回,因为它不知道您是故意跳过返回还是因为您正在利用该语言的默认返回值功能。

从此http://msdn.microsoft.com/en-us/library/sect4ck6(VS.80).aspx

  

如果使用Exit Function而不为name赋值,则该过程返回returntype中指定的数据类型的默认值。如果未指定returntype,则该过程返回Nothing,即Object的默认值。

答案 2 :(得分:0)

对我来说这看起来像个错误。我能够在VS2008 SP1中重现它。

有趣的是,如果它是引用类型它可以工作,但如果它是值类型则不工作。

答案 3 :(得分:0)

您不一定要求解决方法,但我只是大声思考:您可以创建函数Nullable的返回类型。

在运行时,如果函数反映Nothing,您知道程序员没有显式指定返回值。当然,这仅适用于不自然返回Nothing的函数。而且它在很多方面效率低下。

答案 4 :(得分:0)

我只是浪费了七个小时来解决同样的问题。在我的情况下(使用Visual Studio 2012),编译以编译错误结束:

  

错误MSB3030:无法复制文件“obj \ x86 Debug \<构建目标的名称> .exe”,因为找不到该文件。 (0,0)

(该文本是从德语错误信息中翻译出来的,我希望它能正确翻译。)

由于该消息没有帮助,我将我的项目恢复到编译状态,并最终将其跟踪到类似于以下内容:

Function SomeFunction() as Boolean
  If <somecondition> then 
    Exit Function
  end if
end function

如果我将return函数替换为return false,或者如果我插入SomeFunction = false,则编译器错误将不会显示。

所以是的,如前所述,Visual Basic应该将返回值默认为返回类型的默认值,但它以某种方式崩溃了编译。

我怀疑这种行为难以重现。我的底线是:明确设置返回值。代码更清晰,可以节省7个小时的调试时间。