我是新手,正尝试重新参与编程游戏。很抱歉我的无知和缺乏知识。
我试图在下面的代码中查看如何修复返回类型错误消息。我知道我可以使用显式数据类型在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块中定义的。
谢谢。
答案 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);
}