2010-04-20 114 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的行爲。