【问题标题】:Could not find an implementation of the query pattern on IEnumerable<T>在 IEnumerable<T> 上找不到查询模式的实现
【发布时间】:2012-10-14 06:31:45
【问题描述】:

我有一个IEnumerable&lt;T&gt; 作为方法的参数,其中T 是一个结构类型:

using System;
using System.Collections.Generic;
using System.Linq;
using ...

public static class Foo
{
    internal struct CellDiff
    {
        public int RefX;
        public int RefY;
        public object OldValue;
        public object NewValue;
    }

    private static void ItemChanged(IEnumerable<CellDiff> diffs, int cellX, int cellY)
    {
        var change = from CellDiff diff in diffs
                     where diff.RefX == cellX && diff.RefY == cellY
                     select diff;

        ...
    }
}

这会导致以下错误:

(参数)IEnumerable&lt;CellDiff&gt; diffs

错误:
找不到源类型“CellDiff”的查询模式的实现。 'Where' 未找到。

我也尝试过diffs.AsQueryable(),但无济于事。

我在IEnumerable&lt;T&gt; 上进行 LINQ 查询通常没有问题。我对这里发生的事情有点迷茫。

【问题讨论】:

  • 您确定错误出现在代码的那部分吗?除了查询变量上的冗余类型之外,它似乎很好
  • 我刚刚尝试了您的代码并且它工作正常。似乎错误在其他地方。
  • @RuneFS 100% 确定。如果我添加类型,则会出现错误,如果我删除它,错误就会消失。
  • 您是否在 select 或 Cast 上实现了自己的扩展方法?
  • 这是什么版本的 .NET / 编译器?还加载了哪些其他库?我想知道另一个库是否正在将内容添加到 System.Linq 或“...”中的另一个命名空间中

标签: c# linq compiler-errors ienumerable


【解决方案1】:

在 LINQ 查询语法中指定类型会使用该类型参数创建对 Cast 扩展方法的调用。

您是否在某处定义了自己的Cast

【讨论】:

    【解决方案2】:

    您需要更改查询,更新一个是这样的

     var change = from diff in diffs //changed like removed "CellDiff" from this
                         where diff.RefX == cellX && diff.RefY == cellY
                         select diff;
    

    在你查询之后不需要CellDiff

    【讨论】:

    • 为什么会这样?我确定我之前已经包含了该类型并且从未遇到过问题。
    • @Polynomial - 好吧,我从来没有通过在您的查询中包含类型来编写查询......但我认为没有必要包含类型
    • @Polynomial 它不应该是类型是多余的,因此没有语义差异
    • @both 添加类型会增加对.Cast&lt;TWhatever&gt;()的调用,因此在这种情况下,它并不是真正需要的。
    • 这不重要;翻译应该是相同的。包括它不是必需的,但不应破坏它。
    猜你喜欢
    • 2012-01-03
    • 2012-04-06
    • 2017-10-22
    • 2015-03-12
    • 1970-01-01
    • 2014-12-04
    • 1970-01-01
    • 1970-01-01
    • 2015-09-23
    相关资源
    最近更新 更多