C #: Ya se agregó un elemento con la misma clave al compilar la expresión

Ok, aquí hay uno difícil. Esperemos que haya un gurú de la expresión aquí que pueda detectar lo que estoy haciendo mal aquí, porque simplemente no lo entiendo.

Estoy creando expresiones que utilizo para filtrar consultas. Para facilitar ese proceso tengo un par deExpression<Func<T, bool>> métodos de extensión que hacen que mi código sea más limpio y hasta ahora han funcionado bien. He escrito exámenes para todos ellos, excepto uno, que escribí uno para hoy. Y esa prueba falla completamente con unaArgumentException con unlargo seguimiento de la pila. Y simplemente no lo entiendo. ¡Especialmente porque he estado usando ese método por un tiempo exitosamente en mis consultas!

De todos modos, aquí está el seguimiento de pila que obtengo al ejecutar la prueba:

failed: System.ArgumentException : An item with the same key has already been added.
    at System.ThrowHelper.ThrowArgumentException(ExceptionResource resource)
    at System.Collections.Generic.Dictionary`2.Insert(TKey key, TValue value, Boolean add)
    at System.Linq.Expressions.ExpressionCompiler.PrepareInitLocal(ILGenerator gen, ParameterExpression p)
    at System.Linq.Expressions.ExpressionCompiler.GenerateInvoke(ILGenerator gen, InvocationExpression invoke, StackType ask)
    at System.Linq.Expressions.ExpressionCompiler.Generate(ILGenerator gen, Expression node, StackType ask)
    at System.Linq.Expressions.ExpressionCompiler.GenerateBinary(ILGenerator gen, BinaryExpression b, StackType ask)
    at System.Linq.Expressions.ExpressionCompiler.Generate(ILGenerator gen, Expression node, StackType ask)
    at System.Linq.Expressions.ExpressionCompiler.GenerateUnliftedAndAlso(ILGenerator gen, BinaryExpression b)
    at System.Linq.Expressions.ExpressionCompiler.GenerateAndAlso(ILGenerator gen, BinaryExpression b, StackType ask)
    at System.Linq.Expressions.ExpressionCompiler.GenerateBinary(ILGenerator gen, BinaryExpression b, StackType ask)
    at System.Linq.Expressions.ExpressionCompiler.Generate(ILGenerator gen, Expression node, StackType ask)
    at System.Linq.Expressions.ExpressionCompiler.GenerateUnliftedOrElse(ILGenerator gen, BinaryExpression b)
    at System.Linq.Expressions.ExpressionCompiler.GenerateOrElse(ILGenerator gen, BinaryExpression b, StackType ask)
    at System.Linq.Expressions.ExpressionCompiler.GenerateBinary(ILGenerator gen, BinaryExpression b, StackType ask)
    at System.Linq.Expressions.ExpressionCompiler.Generate(ILGenerator gen, Expression node, StackType ask)
    at System.Linq.Expressions.ExpressionCompiler.GenerateInvoke(ILGenerator gen, InvocationExpression invoke, StackType ask)
    at System.Linq.Expressions.ExpressionCompiler.Generate(ILGenerator gen, Expression node, StackType ask)
    at System.Linq.Expressions.ExpressionCompiler.GenerateUnliftedAndAlso(ILGenerator gen, BinaryExpression b)
    at System.Linq.Expressions.ExpressionCompiler.GenerateAndAlso(ILGenerator gen, BinaryExpression b, StackType ask)
    at System.Linq.Expressions.ExpressionCompiler.GenerateBinary(ILGenerator gen, BinaryExpression b, StackType ask)
    at System.Linq.Expressions.ExpressionCompiler.Generate(ILGenerator gen, Expression node, StackType ask)
    at System.Linq.Expressions.ExpressionCompiler.GenerateLambda(LambdaExpression lambda)
    at System.Linq.Expressions.ExpressionCompiler.CompileDynamicLambda(LambdaExpression lambda)
    at System.Linq.Expressions.Expression`1.Compile()
    PredicateTests.cs(257,0): at Namespace.ExpressionExtensionsTests.WhereWithin_CollectionIsFilteredAsExpected()

La prueba en sí se parece a la siguiente, y falla en la declaración de Compilación:

[Test]
public void WhereWithin_CollectionIsFilteredAsExpected()
{
    var range = new[] { Range.Create(2, 7), Range.Create(15, 18) };

    var predicate = Predicate
        .Create<int>(x => x % 2 == 0)
        .AndWithin(range, x => x)
        .Compile();

    var actual = Enumerable.Range(0, 20)
        .Where(predicate)
        .ToArray();

    Assert.That(actual, Is.EqualTo(new[] { 2, 4, 6, 16, 18 }));
}

Simplemente no entiendo el mensaje de error. Pensé que podría tener que ver con el hecho de que siempre usox como el nombre del parámetro, pero no pareció ayudar cuando intenté intercambiarlos. Lo que lo hace aún más extraño para mí es que he estado usando este método exacto durante un tiempo en consultas más grandes de Linq2Sql y siempre han funcionado bien. Así que en mi prueba traté de no compilar la expresión y el usoAsQueryable así que podría usarlo en eso en su lugar. Pero eso solo hizo que la excepción ocurriera en elToArray en lugar. ¿Que esta pasando aqui? ¿Cómo puedo arreglar esto?

Puede encontrar el código ofensivo y molesto en el archivo zip debajo de la línea:

Nota: He publicado parte del código relacionado aquí, pero después de algunos comentarios, decidí extraer el código en su propio proyecto, que muestra la excepción con mayor claridad. Y, lo que es más importante, se puede ejecutar, compilar y depurar.

ExpressionCuriosity.zip

Actualizar: Simplificó aún más el proyecto de ejemplo con algunas de las sugerencias de @Mark. Como eliminar la clase de rango y, en lugar de eso, simplemente codificar de forma rígida un rango constante. También se agregó otro ejemplo en el que usar el mismo método exacto realmente funciona bien. Por lo tanto, usar el método AndWithin hace que la aplicación se bloquee, mientras que usar el método WhereWithin realmente funciona bien. ¡Me siento bastante despistado!

ExpressionCuriosity.zip (Actualizado)

Respuestas a la pregunta(2)

Su respuesta a la pregunta