c# - 在泛型参数上调用扩展方法(例如 "Union")

标签 c# .net generics extension-methods

我们正在尝试构造一个采用泛型类型参数的库例程。我们遇到了一个问题,无论我们如何约束类型,扩展方法“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);

因为 UnionIQueryable<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/

相关文章:

.net - 卡在 .NET 2.0 中。如何从 3.5 或 4.0 开始

c# - 从 Outlook 中获取未读邮件

尝试创建自定义类的通用数组时发生 Java 转换错误

c# - Dictionary ToList 序列化问题

android - 开发基于 Windows 的手机的移动应用程序

java - 使用反射和泛型时发出警告

c# - 如果我无法访问源代码,如何为 EXE 编写 GUI 包装器?

c# - 从 C# 在 JasperServer 上运行报告

c# - 为使用 SSH.NET SshClient.CreateShellStream 执行的命令 (sudo/su) 提供子命令

c# - 何时使用非对称 key 与数字证书