这个c#方法有什么问题?

时间:2010-04-20 12:40:06

标签: c# methods return-value switch-statement

我使用此方法获取文件扩展名

public string ReturnExtension(string fileExtension)
    {
        switch (fileExtension)
        {
            case ".doc":
            case ".docx":
                return "application/ms-word";
        }
    }

当我编译它时,我收到错误BaseClass.ReturnExtension(string)': not all code paths return a value ..任何建议......

8 个答案:

答案 0 :(得分:18)

如果您从default语句中返回,则需要添加switch条件。

// As SLaks mentioned, you should be case in-sensitive.
// Therefore, I'm comparing only the Lower Case version of the extensio

switch(fileExtension.ToLowerInvariant())
{
    case ".doc":
    case ".docx":
        return "application/ms-word";
    default:
        // You could also throw an Exception here if unknown extensions
        // are truly invalid (which seems to be the more popular choice)
        //
        // Since it looks like you're returning a content-type for a
        // download, I would default to octet-stream so the user would
        // just get a download window.
        return "application/octet-stream";
}

答案 1 :(得分:17)

如果fileExtension不是“.doc”或“.docx”,则您尚未指定该方法应返回的内容。您可以通过向switch语句添加默认大小写来完成此操作。假设其他fileExtension值无效,则应抛出异常:

public string ReturnExtension(string fileExtension)
{
    switch (fileExtension)
    {
        case ".doc":
        case ".docx":
            return "application/ms-word";
        default:
            throw new ArgumentException(string.Format("Invalid fileExtension '{0}'.", fileExtension));
    }
}

答案 2 :(得分:4)

您需要默认值,或者需要返回switch以外的内容。

default:
        Console.WriteLine("Default case");
        return "";

答案 3 :(得分:3)

这是编译器可以发出的更好的错误消息之一。这意味着:并非所有代码路径都返回一个值。

通过分支whileifswitch等语句来创建代码路径。

编译器试图保证,只要运行时执行此函数,就会返回指定类型的值(此处为:string)。

在您的示例中,未定义集fileextension中的(doc, docx)的返回值。你可以

  • default声明中指定switch子句
  • 或在方法末尾添加 catch-all return语句(return "text/plain"?)

答案 4 :(得分:1)

编译器从源代码中派生control flow graph并发现并非所有路径都被覆盖,例如,如果传入fileExtension“.rtf”,则此函数无法提供返回值。

因此要么在函数末尾提供返回“something”,要么只是为switch的“default:”情况抛出异常。当它既没有看到“.doc”或“.docx”时,你必须决定函数需要做什么。

答案 5 :(得分:1)

问问自己fileExtension为.xls时会发生什么。您必须在默认情况下或在switch语句之后返回一些内容:

public string ReturnExtension(string fileExtension)
{
    switch (fileExtension)
    {
        case ".doc":
        case ".docx":
            return "application/ms-word";
    }
    return "unknown";  // this path wasn't returning anything
}

答案 6 :(得分:1)

您在上一个案例陈述中需要defaultbreakbreak

答案 7 :(得分:0)

只是我的0.10美元,很清楚内容标题是在这里返回的,所以如果我们不识别文件扩展名,而不是抛出异常或无效的MIME标头信息(例如,“未知”),我们应该返回将文件作为octect流发送到浏览器,如下所示:

public string ReturnExtension(string fileExtension)
{
    switch (fileExtension)
    {
        case ".doc":
        case ".docx":
            return "application/ms-word";
        default:
            return "application/octet-stream";
    }
}

通过这种方式,我们可以适应未来5年的情况,M $发布MS-Word v30.1,扩展名变为“.docz”,系统不会抛出异常,而是调用MS-Word(更多)优雅地,尽管没有使用“application / ms-word”将会增强IE的行为。