var关键字不推断RepeaterItem的类型,为什么呢?

时间:2010-02-11 13:33:22

标签: c# compiler-construction

这是一个快速的。我有以下代码:

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”的类型来修复代码。

3 个答案:

答案 0 :(得分:6)

RepeaterItemCollection未实现IEnumerable<RepeaterItem>只是普通IEnumerable。因此,编译器无法推断出类型。

答案 1 :(得分:1)

首先,您的代码示例显示您在foreach语句中使用名为“item”的变量,然后在其下面声明另一个类型。

第二,您可能将其视为Object类型的原因是myRepeater.Items可能是一般集合而不是特定类型的集合,因此它将返回Object类型。您可以明确说明ForEach循环中的类型,如果存在,它将返回该类型的对象。

一个可能的解决方案是执行myRepeater.Items.OfType()然后你可以使用var关键字。

答案 2 :(得分:1)

正如Anton所说,Items只实现了IEnumerable,这就是它无法推断出类型的原因。

你可能会觉得有用的东西是Cast方法。

myRepeater.Items.Cast<RepeaterItem>()

虽然您的示例很简单,但实际上并不需要它,但对于需要输入可枚举的更复杂的示例可能会有所帮助。