I am looking at NEST library for the Elasticsearch. Trying to create something similar.
But can't understand how they do implicit type conversion in the QueryBase.cs:
private static QueryBase Combine(QueryBase leftQuery, QueryBase rightQuery, Func<QueryContainer, QueryContainer, QueryContainer> combine)
{
if (IfEitherIsEmptyReturnTheOtherOrEmpty(leftQuery, rightQuery, out var q))
return q;
IQueryContainer container = combine(leftQuery, rightQuery);
var query = container.Bool;
return new BoolQuery
{
Must = query.Must,
MustNot = query.MustNot,
Should = query.Should,
Filter = query.Filter,
};
}
Func<QueryContainer, QueryContainer, QueryContainer> combine was passed as an argument and it expects QueryContainer objects as parameter.
But later when we call, we give leftQuery object which is type of QueryBase.
IQueryContainer container = combine(leftQuery, rightQuery);
Why this works, what am I missing here? I can't find any relationship between QueryContainer and QueryBase.