2010-02-11 50 views
1

這是一個快速的。我有以下代碼:
var關鍵字不是推斷RepeaterItem的類型,爲什麼?

foreach (var item in myRepeater.Items) 
{ 
    MyViewModelItem x = new MyViewModelItem(); 
    MapToEntity(x, item); 
    myList.Add(report); 
} 

void MapToEntity(object entity, Control control); 

我希望這段代碼編譯時沒有問題。但是,它沒有。
它導致編譯時錯誤,指出方法「MapToEntity」有一些無效的參數。編譯器無法推斷出RepeaterItem的類型,它將它識別爲普通的System.Object。

這是爲什麼發生?我錯過了什麼嗎?
Ps:我通過刪除var關鍵字並明確定義了項目「RepeaterItem」的類型來修正了代碼。

回答

6

RepeaterItemCollection不執行IEnumerable<RepeaterItem>只是簡單IEnumerable。因此,編譯器不可能推斷出類型。

+2

walkaround將是'Items.OfType ()'或'Items.Cast ()' – 2010-02-11 13:38:46

+0

啊哈..現在,我明白了。謝謝安東! – Galilyou 2010-02-11 13:55:44

+1

您應該注意.OfType()是「更安全」的,因爲它將刪除任何非正確類型的值。而.Cast()會拋出異常。如果您的收藏中沒有混合類型,則不是問題。 – 2010-02-11 14:44:53

1

首先,您的代碼示例顯示您在foreach語句中使用名爲「item」的變量,然後在其下面聲明另一個類型的變量。

其次,您可能將其視爲Object類型的原因是,myRepeater.Items可能是一個通用集合,而不是特定類型的集合,因此它將返回Object類型。您可以明確說明ForEach循環中的哪種類型,並且它將返回該類型的對象(如果存在的話)。

一個可能的解決方案是做myRepeater.Items.OfType(),然後你可以使用var關鍵字。

1

正如Anton所說,這些Items只實現IEnumerable,這就是爲什麼它不能推斷出類型。

您可能會發現有用的一件事是Cast方法。

myRepeater.Items.Cast<RepeaterItem>() 

雖然您的示例非常簡單,但實際上並不需要它,它可能有助於您需要類型化枚舉的更復雜的示例。

相關問題