0

为什么尝试从 vb.net 的其余代码中捕获隐藏变量。

我在网上搜索并找到了一些 C# 答案,但我对 C# 的理解不够好,无法理解他们在说什么。

     Public Function GetUsers(ByVal Path As String) As System.Collections.Generic.IEnumerable(Of System.IO.DirectoryInfo)
    Dim users As System.Collections.Generic.IEnumerable(Of System.IO.DirectoryInfo)
    Dim DDLEXEPath As String = Path
    'this is start directory
    Dim curPath = DDLEXEPath.Substring(0, DDLEXEPath.LastIndexOf("\"))

    Try
        Dim diTop As New DirectoryInfo(curPath)
        users = diTop.EnumerateDirectories
    Catch UnAuthTop As UnauthorizedAccessException
        Debug.WriteLine("{0}", UnAuthTop.Message)
    Catch LongPath As Exception
        Console.WriteLine("{0}", LongPath.Message)
    End Try
    Return users
End Function

我收到“返回用户”中的用户未初始化的错误。我已经在 try 块中为其分配了一个值。

我玩过遵循相同格式的简单字符串并得到相同的错误。

到目前为止,这已经是漫长的一个月了;-(

谢谢。

4

4 回答 4

4

“尝试/捕捉”不会“隐藏”任何东西。但是由于您在“try”中分配了“users”,并且由于(根据定义)不能保证“try”会完成,VB.Net 在返回时认为“users”“未初始化”。

解决方案:

在 try/catch之外显式初始化用户:

    users = Nothing
    Try
        Dim diTop As New DirectoryInfo(curPath)
        users = diTop.EnumerateDirectories
    Catch UnAuthTop As UnauthorizedAccessException
        Debug.WriteLine("{0}", UnAuthTop.Message)
    Catch LongPath As Exception
        Console.WriteLine("{0}", LongPath.Message)
    End Try
    Return users
于 2013-03-12T05:32:43.133 回答
0

因为 try 打开了一个新的范围,而您的 return 语句超出了这个范围。

解决方案 1:将 return 移到 try 块内,并将其作为最后一行放在那里。

解决方案 2:将 dim 移到 try 之前,并仅保留 try 中的分配。

于 2013-03-12T05:32:08.523 回答
0

您只需在 try catch 块中设置用户的值。

以下仅定义用户类型

 Dim users As System.Collections.Generic.IEnumerable(Of System.IO.DirectoryInfo)

添加新的以初始化它

 Dim users As new System.Collections.Generic.IEnumerable(Of System.IO.DirectoryInfo)
于 2013-03-12T05:32:29.897 回答
0

错误消息告诉您的是,users必须先为它分配一个值Return(或者除分配它之外做任何其他事情)。因此,只需在声明时明确声明users要设置的Nothing内容。

Dim users As IEnumerable(Of DirectoryInfo) = Nothing
于 2013-03-12T05:32:45.783 回答