C# var关键字是';I don’我不能推断重复项的类型,为什么?

C# var关键字是';I don’我不能推断重复项的类型,为什么?,c#,compiler-construction,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); 我希望这段代码能够顺利编译。但事实并非如此 它导致编译时错误,称方法“MapToEn

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

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

没有实现
IEnumerable
只是简单的
IEnumerable
。因此,编译器不可能推断类型。

不实现
IEnumerable
只是简单的
IEnumerable
。因此,编译器无法推断类型。

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

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


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

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

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


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

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

不过,您可能会发现Cast方法很有用

myRepeater.Items.Cast<RepeaterItem>()
myRepeater.Items.Cast()

虽然您的示例非常简单,不需要这样做,但对于需要类型化枚举的更复杂示例可能会有所帮助。

正如Anton所说,这些项只实现IEnumerable,这就是它无法推断类型的原因

不过,您可能会发现Cast方法很有用

myRepeater.Items.Cast<RepeaterItem>()
myRepeater.Items.Cast()

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

详细介绍将是
Items.OfType()
Items.Cast()
Aha。。现在,我明白了。谢谢安东!您应该注意,.OfType()更“安全”,因为它将删除任何类型不正确的值。While.Cast()将引发异常。如果集合中没有混合类型,则不会出现问题。演练将是
Items.OfType()
Items.Cast()
Aha。。现在,我明白了。谢谢安东!您应该注意,.OfType()更“安全”,因为它将删除任何类型不正确的值。While.Cast()将引发异常。如果集合中没有混合类型,则这不是问题。