2010-02-11 51 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>() 

虽然您的示例非常简单,但实际上并不需要它,它可能有助于您需要类型化枚举的更复杂的示例。

相关问题