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
.
As @Severius5 said in the comment, the answer is here in the line 112:
public static implicit operator QueryContainer(QueryBase query) =>
query == null ? null : new QueryContainer(query);
Basically, it called implicit user-defined type conversion operator. Thank you very much.
You can read more documentation