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

Nic*_*ick 6 vb.net warnings

关于Stack Overflow问题的一些评论为什么C#编译器不会阻止属性引用自己?关于警告让我思考在我编写更多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
Run Code Online (Sandbox Code Playgroud)

我也走进了项目设置,转身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
Run Code Online (Sandbox Code Playgroud)

如果我有一个明确ReturnIf,并且没有任何内容Else,那么也没有警告或错误.它将简单地采用默认值,即使您可能(通过编程风格)有明确的返回.在这种情况下,我明确地返回False(这是布尔默认值),所以它可能是我应该回到一个隐藏的错误TrueElse.

GSe*_*erg 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
Run Code Online (Sandbox Code Playgroud)

  • 最好的解释......但仍然感觉像一个错误.绝对不是基于项目设置中编译器开关名称的预期行为.我希望函数返回值类型和引用类型的行为方式与C#中的相同. (2认同)

Joh*_*ler 6

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

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

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

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