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

3

我使用这种方法来获取文件扩展名:

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。有什么建议...

2
你不应该区分大小写。 - SLaks
4
ReturnExtension -> GetMimeTypeFromExtension:将ReturnExtension转换为GetMimeTypeFromExtension。 - VladV
正如@Slaks所说,如果您在将参数传递给ReturnExtension()之前没有强制将其转换为小写,则可能需要使用以下代码:switch (fileExtension.ToLower()) - JeffH
1
@JeffH: ToLowerInvariant() - SLaks
@Slaks - 很好的发现关于“不变量”。 - JeffH
显示剩余2条评论
8个回答

17

如果你从switch语句内部返回,就需要添加一个default条件。

// 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";
}

3
@Adrian:不对。一个空的语句块可以隐式地穿透。 - SLaks

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));
    }
}

1
异常比沉默的默认值更好 +1 - Rob Fonseca-Ensor

4

你需要设置默认值或在switch外返回一些内容。

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

3

这是编译器可以发出的更好的错误消息之一。它的意思很明确:不是所有的代码路径都返回一个值。

代码路径由像whileifswitch这样的分支语句创建。

编译器试图保证,每当运行时执行此函数时,将返回指定类型(这里是string)的值。

在你的例子中,对于集合(doc, docx)中没有的fileextension的返回值未被定义。你可以:

  • 在你的switch语句中指定一个default子句
  • 或在你的方法末尾添加一个捕获所有的返回语句(return "text/plain"?)

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
}

1
编译器从我们的源代码中推导出一个控制流图,并发现并非所有路径都被覆盖。例如,如果传入一个文件扩展名为“.rtf”,这个函数就无法提供返回值。
因此,在函数末尾提供一个返回“something”的语句,或者在switch的“default:”情况下简单地抛出异常。你必须决定在既不看到“.doc”也不看到“.docx”时,该函数需要做什么。

1
你需要在最后一个 case 语句中使用 break,或者同时使用 defaultbreak

不需要在return后加break。 - H H

0

仅提供我的0.10美元,很明显这里返回的是内容头,因此如果我们不认识文件扩展名,与其抛出异常或无效的MIME头信息(例如“未知”),我们应该将文件作为八位字节流返回给浏览器,就像这样:

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

这样我们就可以适应未来5年,微软发布了MS-Word v30.1,并且扩展名变成了“.docz”的情况,系统不会抛出异常,而是更加优雅地调用MS-Word,尽管它不使用“application/ms-word”所提供的IE增强行为。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接