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()将引发异常。如果集合中没有混合类型,则这不是问题。