2010-04-20 170 views
3

我用这个方法来获取文件扩展名,这个c#方法有什么问题?

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 2010-04-20 12:42:57

+4

ReturnExtension - > GetMimeTypeFromExtension :-) – VladV 2010-04-20 12:57:34

+0

正如@Slaks所说,如果您在将它传递给ReturnExtension()之前不强制您的参数为小写,那么您可能需要:switch(fileExtension.ToLower()) – JeffH 2010-04-20 12:58:37

回答

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"; 
} 
+3

@Adrian:错了。 empy案件可以隐含地通过。 – SLaks 2010-04-20 13:26:05

+0

哦,是的 - 我从来没有注意到... – Adrian 2010-04-20 13:48:50

4

您需要预设或您需要返回switch以外的内容。

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

如果fileExtension不是“.doc”或“.docx”,您尚未指定该方法应返回的内容。你可以通过在switch语句中添加一个缺省的case来完成。假设其他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 – 2010-04-20 13:12:45

1

编译器派生从我们的源control flow graph,并认为,并不是所有的路径都包括在内,例如,如果你在一个fileExtension“.RTF”通这个函数不能提供返回值。

因此,要么提供一个回报“东西”,在函数的末尾或者干脆抛出交换机的一个例外“默认:”情况。你不得不决定这个函数在没有看到“.doc”或“.docx”的情况下需要做什么。

3

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

代码路径是通过分支语句如whileifswitch创建的。

编译器试图保证,每当运行时执行该功能,值将被指定的类型(在这里:string)的返回。

在您的示例中,没有定义fileextension不在集合(doc, docx)中的返回值。您可以

  • switch声明
  • 指定default条款或在你的方法的末尾添加包罗万象的 return语句(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

你需要一个defaultbreak,或您最后一次case语句break

+0

没有。返回后没有必要休息。 – 2010-04-20 14:19:54

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年的道路,M $发布MS-Word中V30。 1,并且扩展名成为“.docz”,系统不会抛出异常,但可以优雅地调用MS-Word(更多),尽管不会使用“application/ms-word”会增强IE的行为。