C#-在try块外定义var并将其返回

时间:2018-08-03 18:10:20

标签: c# scope var try-catch-finally

我是新手,正尝试重新参与编程游戏。很抱歉我的无知和缺乏知识。

我试图在下面的代码中查看如何修复返回类型错误消息。我知道我可以使用显式数据类型在try块之外定义变量,但是可以针对“ var”或任何其他建议进行设置。

private IEnumerable GetDirFiles(String location)
{
    try
    {
        //Search all directories for txt files
        var emailfiles = Directory.EnumerateFiles(location, "*.txt", SearchOption.AllDirectories);
    }
    catch(Exception ex)
    {
        Console.WriteLine("Message for admins: " + ex.Message);
    }
    finally
    {
        textBox1.Clear();
        var emailfiles = Directory.EnumerateFiles(location, "*.msg", SearchOption.AllDirectories);
    }

    return emailfiles;
}

错误消息是“当前上下文中不存在电子邮件文件”,我理解原因,因为它是在try块中定义的。

谢谢。

6 个答案:

答案 0 :(得分:5)

是的,您需要在块外声明emailFiles,并且var都不起作用(在没有体操的情况下)。

var需要分配,因为它使用隐式类型。没有值,没有什么可以获取类型的。

您唯一的其他选择是从try和catch块中return,而不是方法的结尾。

@AdamVincent指出您遇到了更大的问题;这是因为finally块始终执行(无论是否有异常),返回值实际上总是 Directory.EnumerateFiles(location, "*.msg", SearchOption.AllDirectories)。您可能打算将其放在catch块中。

答案 1 :(得分:0)

请不要使用var。找出从Directory.EnumerateFiles(可能是System.Collections.Generic.IEnumerable)返回的类型。无论如何,这是您唯一设置电子邮件文件的类型。然后,您可以像这样初始化它:

(任何类型)电子邮件文件;

try块之外。

答案 2 :(得分:0)

在这种情况下,您可以从尝试返回,也可以按照其他答案的建议最终返回。但是如果您要在try或最后执行更多操作,则可以在try块之外声明对象,如下所示。

private IEnumerable GetDirFiles(String location)
{
    IEnumerable<string> emailfiles; // just declare the variable outside try..catch scope.
    try
    {
        //Search all directories for txt files
        emailfiles = Directory.EnumerateFiles(location, "*.txt", SearchOption.AllDirectories);
        // any other operations on emailfiles goes here
    }
    catch(Exception ex)
    {
        Console.WriteLine("Message for admins: " + ex.Message);
    }
    finally
    {
        textBox1.Clear();
        emailfiles = Directory.EnumerateFiles(location, "*.msg", SearchOption.AllDirectories);
    // any other operations on emailfiles goes here
    }
    return emailfiles;
}

答案 3 :(得分:0)

由于您无需使用此方法对EnumerateFiles调用的结果进行任何处理,因此为简洁起见,直接返回结果即可。

private IEnumerable GetDirFiles(String location)
{
    try
    {
        //Search all directories for txt files
        return Directory.EnumerateFiles(location, "*.txt", SearchOption.AllDirectories);
    }
    catch(Exception ex)
    {
        Console.WriteLine("Message for admins: " + ex.Message);
    }        
    finally
    {
        textBox1.Clear();
        return Directory.EnumerateFiles(location, "*.msg", SearchOption.AllDirectories);
    }
}

如果在返回之前碰巧需要处理文件列表,则必须在try..catch块之外定义变量,并指定类型,如下所示:

private IEnumerable GetDirFiles(String location)
{
    IEnumerable<string> emailfiles;
    try
    {
        //Search all directories for txt files
        emailfiles = Directory.EnumerateFiles(location, "*.txt", SearchOption.AllDirectories);
    }
    catch(Exception ex)
    {
        Console.WriteLine("Message for admins: " + ex.Message);
    }        
    finally
    {
        textBox1.Clear();
        emailfiles = Directory.EnumerateFiles(location, "*.msg", SearchOption.AllDirectories);
    }

    // now do something with emailfiles
    return emailfiles;
}

希望这会有所帮助!

答案 4 :(得分:0)

private IEnumerable<string> GetDirFiles(String location)
{
    IEnumerable<string> emailfiles = Enumerable.Empty<string>();
    try
    {
        //Search all directories for txt files
        emailfiles = Directory.EnumerateFiles(location, "*.txt", SearchOption.AllDirectories);
    }
    catch (Exception ex)
    {
        Console.WriteLine("Message for admins: " + ex.Message);
    }
    finally
    {
        textBox1.Clear();
        emailfiles = Directory.EnumerateFiles(location, "*.msg", SearchOption.AllDirectories);
    }

    return emailfiles;
}

您还忘记了返回要返回的IEnumerable类型

答案 5 :(得分:0)

我希望下面的更改不要让您感到困惑。我已将IEnumerable更改为IEnumerable<string>以访问LINQ方法。在这种情况下,.Any()可以查看GetTextFiles()是否有任何结果。如果GetTextFiles()没有返回结果,它将返回GetEmailFiles()。如果任何一个抛出异常,它将被捕获。最后,无论结果如何,您的文本框都会被清除。

private IEnumerable<string> GetDirFiles(string location)
{
    IEnumerable<string> result;
    try
    {
        result = GetTextFiles(location).ToList(); //Added .ToList() to avoid multiple enumerations.

        if (!result.Any())
        {
          result = GetMsgFiles(location);
        }

    }
    catch(Exception ex)
    {
        Console.WriteLine("Message for admins: " + ex.Message);
    }
    finally
    {
        textBox1.Clear();
    }

    return result;
}

private IEnumerable<string> GetTextFiles(string location)
{
    return Directory.EnumerateFiles(location, "*.txt", SearchOption.AllDirectories);
}

private IEnumerable<string> GetMsgFiles(string location)
{
    return Directory.EnumerateFiles(location, "*.msg", SearchOption.AllDirectories);
}