如何定义用于搜索整数列表的 TermsQuery?
How to define TermsQuery for searching list of integer?
使用对象初始值设定项语法,在定义条款的行上,出现错误:无法将源类型 'System.Collections.Generic.List<int>' 转换为目标类型 'System.Collections.Generic.IEnumerable<object>'
var query = new TermsQuery
{
Field = new Field("seq"),
Terms = new List<int> {1 ,2, 3}
};
如果使用流畅的 DSL 进行定义,则此方法有效
var search = new List<int> {1, 2, 3};
q.Terms(c => c
.Field(p => p.seq)
.Terms(search)
)
我在对象初始值设定项语法上做错了什么?提前感谢您的帮助。
我可以把第一种情况的失败归结为C#
的一个基本点。 int
是一种值类型,尝试将 List<int>
分配给 IEnumerable<object>
失败,因为值类型不支持泛型变化。如果将 List<string>
分配给 IEnumerable<object>
引用类型,则同样可以正常工作。看看 this answer by Jon Skeet to understand more on this. Additionally, you can look up more on the Covariance and Contravariance in generics from MSDN。实现此功能的一种方法是对 List<int>
类型变量执行显式转换。
此外,对于流畅的 DSL 方法,Terms
方法有两种可能的重载。
TermsQueryDescriptor<T> Terms<TValue>(IEnumerable<TValue> terms)
和
TermsQueryDescriptor<T> Terms<TValue>(params TValue[] terms)
如果您查看 here 中这些方法的实现,您会发现正在推断传入的类型 T
并且所需的转换是在内部完成的。这就是为什么在流畅的 DSL 方法中你不会遇到这个问题。
使用对象初始值设定项语法,在定义条款的行上,出现错误:无法将源类型 'System.Collections.Generic.List<int>' 转换为目标类型 'System.Collections.Generic.IEnumerable<object>'
var query = new TermsQuery
{
Field = new Field("seq"),
Terms = new List<int> {1 ,2, 3}
};
如果使用流畅的 DSL 进行定义,则此方法有效
var search = new List<int> {1, 2, 3};
q.Terms(c => c
.Field(p => p.seq)
.Terms(search)
)
我在对象初始值设定项语法上做错了什么?提前感谢您的帮助。
我可以把第一种情况的失败归结为C#
的一个基本点。 int
是一种值类型,尝试将 List<int>
分配给 IEnumerable<object>
失败,因为值类型不支持泛型变化。如果将 List<string>
分配给 IEnumerable<object>
引用类型,则同样可以正常工作。看看 this answer by Jon Skeet to understand more on this. Additionally, you can look up more on the Covariance and Contravariance in generics from MSDN。实现此功能的一种方法是对 List<int>
类型变量执行显式转换。
此外,对于流畅的 DSL 方法,Terms
方法有两种可能的重载。
TermsQueryDescriptor<T> Terms<TValue>(IEnumerable<TValue> terms)
和
TermsQueryDescriptor<T> Terms<TValue>(params TValue[] terms)
如果您查看 here 中这些方法的实现,您会发现正在推断传入的类型 T
并且所需的转换是在内部完成的。这就是为什么在流畅的 DSL 方法中你不会遇到这个问题。