Search code examples
c#nest

How does NEST (C#) implicitly convert types?


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.


Solution

  • 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