代码之家  ›  专栏  ›  技术社区  ›  Ahmed

var关键字不是推断转发器项的类型,为什么?

  •  1
  • Ahmed  · 技术社区  · 14 年前

    这很快。我有以下代码:

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

    我希望这段代码编译时没有问题。但事实并非如此。
    它导致了一个编译时错误,说明方法“maptoEntity”有一些无效参数。编译器无法推断中继器项的类型,它将其识别为纯System.Object。

    为什么会这样?我错过什么了吗?
    ps:我通过删除var关键字并显式定义项目“repeateritem”的类型来修复代码。

    3 回复  |  直到 14 年前
        1
  •  6
  •   Anton Gogolev    14 年前

    RepeaterItemCollection 不实现 IEnumerable<RepeaterItem> 朴素 IEnumerable . 因此,编译器不可能推断类型。

        2
  •  1
  •   Adam Gritt    14 年前

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

    其次,您可能将其视为类型对象的原因是myRepeater.items可能是一个常规集合,而不是一个特定类型的集合,因此它将返回类型对象。您可以在foreach循环中具体说明什么类型,如果存在,它将返回该类型的对象。

    可能的解决方案是执行myrepeater.items.oftype(),然后可以使用var关键字。

        3
  •  1
  •   Robin Day    14 年前

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

    但有一件事你可能会发现很有用,那就是强制转换方法。

    myRepeater.Items.Cast<RepeaterItem>()
    

    虽然您的示例足够简单,不需要它,但对于需要类型化可枚举的更复杂的示例,它可能会有所帮助。