C #: элемент с тем же ключом уже был добавлен при компиляции выражения

Хорошо, вот хитрый. Надеюсь, здесь есть гуру выражений, который может определить, что я делаю здесь неправильно, потому что я просто не понимаю.

Я создаю выражения, которые я использую для фильтрации запросов. Чтобы облегчить этот процесс, у меня есть параExpression<Func<T, bool>> методы расширения, которые делают мой код чище, и до сих пор они работали хорошо. Я написал тесты для всех из них, кроме одного, который я написал один на сегодня. И этот тест полностью проваливается сArgumentException сдолго трассировки стека. И я просто не понимаю. Тем более, что я успешно использовал этот метод в своих запросах!

В любом случае, вот трассировка стека, которую я получаю при запуске теста:

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()

Сам тест выглядит следующим образом, но он проваливается в операторе Compile:

[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 }));
}

Я просто не понимаю сообщение об ошибке. Я думал, что это может быть связано с тем, что я всегда используюx как имя параметра, но, похоже, не помогло, когда я попытался поменять их местами. Что делает меня еще более странным, так это то, что я уже некоторое время использую этот точный метод в больших запросах Linq2Sql, и они всегда хорошо работают. Так что в моем тесте я попытался не скомпилировать выражение и использоватьAsQueryable так что я мог бы использовать это вместо этого. Но это только сделало исключение наToArray вместо. Что здесь происходит? Как я могу это исправить?

Вы можете найти нарушающий и раздражающий код в zip-файле под строкой:

Примечание: Я разместил здесь некоторый связанный код, но после некоторых комментариев я решил извлечь код в его собственный проект, который более четко показывает исключение. И что еще более важно, это может быть запущено, скомпилировано и отлажено.

ExpressionCuriosity.zip

Обновить: Упрощенный пример проекта еще больше с некоторыми предложениями @Mark. Как удаление класса диапазона, а вместо этого просто жесткое кодирование одного константы диапазона. Также добавлен еще один пример, где использование точно такого же метода на самом деле работает нормально. Таким образом, использование метода AndWithin приводит к сбою приложения, в то время как метод WhereWithin действительно работает нормально. Я чувствую себя в значительной степени невежественным!

ExpressionCuriosity.zip (Обновлено)

Ответы на вопрос(2)

Ваш ответ на вопрос