在 IEnumerable<T> 上找不到查询模式的实现
Posted
技术标签:
【中文标题】在 IEnumerable<T> 上找不到查询模式的实现【英文标题】:Could not find an implementation of the query pattern on IEnumerable<T> 【发布时间】:2012-10-14 06:31:45 【问题描述】:
我有一个IEnumerable<T>
作为方法的参数,其中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<CellDiff> diffs
错误: 找不到源类型“
CellDiff
”的查询模式的实现。 'Where
' 未找到。
我也尝试过diffs.AsQueryable()
,但无济于事。
我在IEnumerable<T>
上进行 LINQ 查询通常没有问题。我对这里发生的事情有点迷茫。
【问题讨论】:
您确定错误出现在代码的那部分吗?除了查询变量上的冗余类型之外,它似乎很好 我刚刚尝试了您的代码并且它工作正常。似乎错误在其他地方。 @RuneFS 100% 确定。如果我添加类型,则会出现错误,如果我删除它,错误就会消失。 您是否在 select 或 Cast 上实现了自己的扩展方法? 这是什么版本的 .NET / 编译器?还加载了哪些其他库?我想知道另一个库是否正在将内容添加到 System.Linq 或“...”中的另一个命名空间中 【参考方案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<TWhatever>()
的调用,因此在这种情况下,它并不是真正需要的。
这不重要;翻译应该是相同的。包括它不是必需的,但不应破坏它。以上是关于在 IEnumerable<T> 上找不到查询模式的实现的主要内容,如果未能解决你的问题,请参考以下文章
如何将两个 IEnumerable<T> 连接成一个新的 IEnumerable<T>?
在 C# 中将多个 IEnumerable<T> 提要混合为一个
无法将类型“IEnumerable<T>”隐式转换为“ActionResult<IEnumerable<T>>”