2013-03-28 66 views
0

我有這樣的代碼在一個新的類:爲什麼我得到「無法轉換錯誤」?

Object[] temp_arr = new Object[5]; 
       temp_arr[0] = csFiles; 
       temp_arr[1] = mainUrl; 
       temp_arr[2] = levels; 
       temp_arr[3] = currentCrawlingSite; 
       temp_arr[4] = sitesToCrawl; 

變量csFiles和currentCrawlingSite都列出<字符串>。

然後在底部我所做的:

public class WebCrawlerProgressEventHandler : EventArgs 
{ 
    public List<string> csFiles { get; set; } 
    public string mainUrl { get; set; } 
    public int levels { get; set; } 
    public List<string> currentCrawlingSite { get; set; } 
} 

protected void OnProgressEvent(Object[] some_params) 
{ 
    if (ProgressEvent != null) 
     ProgressEvent(this, 
         new WebCrawlerProgressEventHandler() 
         { 
          csFiles = some_params[0], 
          mainUrl = some_params[1], 
          levels = some_params[2], 
          currentCrawlingSite = some_params[3] 
         }); 
} 

現在我對新WebCrawlerProgressEventHandler()每行的同樣的錯誤裏面所有的線得到一個錯誤:

錯誤2不能將類型'object'隱式轉換爲'System.Collections.Generic.List'爲 。一個顯式轉換 存在(是否缺少強制轉換?)

但如果我刪除行:public List<string> currentCrawlingSite { get; set; }和行:currentCrawlingSite = some_params[3]沒有錯誤。

我不明白。 csFilescurrentCrawlingSite都是List<string>類型變量。爲什麼,當我添加currentCrawlingSite時,我是否收到錯誤/ s?

回答

2

因爲編譯器沒有也不能知道Object陣列的第一個和第四個元素碰巧是List<string>

您必須相應地丟掉。

csFiles = (List<String>)some_params[0] 

等或更好,使用適當的類型來傳遞數據,而不是圍繞一個簡單的Object -array如果可能的。

0

假設你分配的數據是一個列表<字符串>您需要將其轉換爲這種類型:

new WebCrawlerProgressEventHandler() 
{ 
    csFiles = (List<string>)some_params[0], 
    mainUrl = some_params[1], 
    levels = some_params[2], 
    currentCrawlingSite = (List<string>)some_params[3] 
}); 
0

它是強類型的保護。你應該明確地對象轉換List<string>,以確保你不只是混淆了不同類型在編譯時

csFiles = (List<string>)some_params[0] 

您不必對mainUrl = some_params[1]一個錯誤,因爲每個對象都有ToString()方法和默認行爲是爲隱式類型轉換調用此方法。

J.裏希特在書中寫道:

例如,C#不需要任何特殊的語法投對象 任何其基本類型,因爲強制轉換爲基類型被認爲是安全的 隱式轉換。但是,C#確實要求開發人員將 明確地將對象轉換爲其任何派生類型,因爲這樣的 強制轉換在運行時可能會失敗。

1

的這裏的一點是,OnProgressEvent正在向您發送一個Object數組,所以你想在這「罪魁禍首」行分配給ObjectList<string>變量,從而隱含調用轉換操作。你應該在那裏做一個明確的演員來解決你的問題。

C#中的新的和優選的語法是:

csFiles = some_params[0] as List<String>; 
0

currentCrawlingSiteList<string>一個實例,some_paramsobject陣列的一個實例。

你不能含蓄地轉換這兩種類型。你必須使用明確的對話。你可以像使用它們一樣;

currentCrawlingSite = (List<string>)some_params[3]; 

等於也

currentCrawlingSite = some_params[3] as List<string>; 

您可以從Casting and Type Conversions (C# Programming Guide)

閱讀更多細節
相關問題