我们正在尝试构造一个采用泛型类型参数的库例程。我们遇到了一个问题,无论我们如何约束类型,扩展方法“Union”都不会被识别为对通用类型参数有效。
这是一个简单的、大大简化的例子来说明这个问题:
private IQueryable<int> Test(IQueryable<int> temp1, IQueryable<int> temp2)
{
return temp1.Union(temp2); // compiles fine
}
private T Test<T>(T temp1, T temp2) where T : IQueryable
{
return temp1.Union(temp2); // Error 15 'T' does not contain a definition for 'Union' and no extension method 'Union' accepting a first argument of type 'T' could be found
}
问题似乎是 Union 是作为 IQueryable 的扩展方法实现的,而不是作为 IQueryable 接口(interface)本身的一部分。似乎必须有一种相当简单的方法来完成这项工作,但我一直在通过 StackOverflow 和 Google 搜索,但没有任何运气。非常感谢任何帮助。
=================================
编辑:
这确实会编译:
private IQueryable<T> Test<T>(IQueryable<T> temp1, IQueryable<T> temp2)
{
return temp1.Union(temp2); // compiles fine
}
但是,这并没有解决我真正的问题,这就是为什么在泛型参数上无法识别扩展方法的原因。该解决方案简单地消除了(如前所述,已大大简化的)示例的关键点中的“泛型主义”。我认为,正如一个答案所指出的那样,IQueryable
之间的区别确实存在。和 IQueryable<>
很重要。
郑重声明,我也尝试过:
private C<T> Test<C, T>(C<T> temp1, C<T> temp2) // The type parameter 'C' cannot be used with type arguments
{
return temp1.Union(temp2);
}
这给出了编译器错误的注释。
最佳答案
代码无法编译,因为这也无法编译:
IQueryable a, b;
a.Union(b);
因为 Union
在 IQueryable<T>
上工作,不是 IQueryable
.
IQueryable<TItem> Test<T, TItem>(T temp1, T temp2) where T : IQueryable<TItem>
{
return temp1.Union(temp2);
}
您需要将其设为界面的通用版本并指定项目类型。返回类型不能是 T
因为Union
不返回 T
, 它返回 IQueryable<TItem>
.
事实上,我想你的意思是:
IQueryable<TItem> Test<TItem>(IQueryable<TItem> temp1, IQueryable<TItem> temp2)
{
return temp1.Union(temp2);
}
哪个更简单。
关于c# - 在泛型参数上调用扩展方法(例如 "Union"),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20336818/