Comparing similar types that don't share any interface
You can shorten the syntax a bit and increase readability by using the is or == operators instead of ReferenceEquals:

public new bool Equals(object x, object y)
{
    if (ReferenceEquals(x, y)) return true;
    if (x is null || y is null) return false;
    {
        if (x is Tx tx &amp;&amp; y is Ty ty &amp;&amp; Equals(tx, ty)) return true;
    }
    {
        if (x is Ty ty &amp;&amp; y is Tx tx &amp;&amp; Equals(tx, ty)) return true;
    }
    return false;
}


The extra braces to make the variables local to their body is clever, however I cant exactly say I like it, it's very easy to consider the first braces to be part of the if statement above them and it can be made much more readable too if you extract it to a method:

public new bool Equals(object x, object y)
{
    if (ReferenceEquals(x, y)) return true;
    if (x is null || y is null) return false;
    return CompareObjects(x, y) || CompareObjects(y, x);
}

protected bool CompareObjects(object x, object y)
{
    return x is Tx tx &amp;&amp; y is Ty ty &amp;&amp; Equals(tx, ty);
}


You can also define 2 generic type arguments for the CompareObjects methods, to make it more explicit, that you're swapping the types.


private bool Equals(Tx x, Ty y)



Feels weird and out of place in my opinion, you're checking if the values of x and y are null, but you've already done so in public new bool Equals(object x, object y) and since it's a private method, that doesn't make much sense, removing this check makes it a simple call to _equals, which makes the whole method redundant, you are better off making it protected virtual, or just delete it all together

protected virtual bool Equals(Tx x, Ty y)
{
    return x != null &amp;&amp; y != null &amp;&amp; _equals(x, y);
}


You also lack null checks for the delegates in the Create method, but I assume you've omitted those for simplicity/