如何定义用于搜索整数列表的 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 方法中你不会遇到这个问题。