Skip to content

IndexOutOfRangeException in MethodFinder.FirstIsBetterThanSecond after upgrading to v1.7.2 #980

Description

@joelleejohn

Description

After upgrading from v1.7.1 to v1.7.2, we're getting IndexOutOfRangeException originating from MethodFinder.cs. This did not occur on v1.7.1.

Environment

  • System.Linq.Dynamic.Core v1.7.2
  • .NET 10

Workaround

Pin to v1.7.1 until this is resolved.

Reproduction

using System.Linq.Dynamic.Core;
using System.Linq.Dynamic.Core.Parser;
using System.Linq.Expressions;

// Repro: string.Concat with 3 args triggers IndexOutOfRangeException in v1.7.2
// Works fine in v1.7.1

var config = ParsingConfig.Default;
config.AllowEqualsAndToStringMethodsOnObject = true;

var parameters = new[]
{
    Expression.Parameter(typeof(string), "x"),
    Expression.Parameter(typeof(string), "y")
};

var parser = new ExpressionParser(
    parameters,
    "string.Concat(x, \" - \", y)",
    values: null,
    config);

// IndexOutOfRangeException thrown here
var result = parser.Parse(typeof(string));

Call Stack

Unhandled exception. System.IndexOutOfRangeException: Index was outside the bounds of the array.
   at System.Linq.Dynamic.Core.Parser.SupportedMethods.MethodFinder.FirstIsBetterThanSecond(Expression[] args, MethodData first, MethodData second) in C:\dev\GitHub\System.Linq.Dynamic.Core\src\System.Linq.Dynamic.Core\Parser\SupportedMethods\MethodFinder.cs:line 339
   at System.Linq.Dynamic.Core.Parser.SupportedMethods.MethodFinder.<>c__DisplayClass10_1.<FindBestMethodBasedOnArguments>b__3(MethodData n) in C:\dev\GitHub\System.Linq.Dynamic.Core\src\System.Linq.Dynamic.Core\Parser\SupportedMethods\MethodFinder.cs:line 179
   at System.Linq.Enumerable.All[TSource](IEnumerable`1 source, Func`2 predicate)
   at System.Linq.Dynamic.Core.Parser.SupportedMethods.MethodFinder.<>c__DisplayClass10_0.<FindBestMethodBasedOnArguments>b__2(MethodData m) in C:\dev\GitHub\System.Linq.Dynamic.Core\src\System.Linq.Dynamic.Core\Parser\SupportedMethods\MethodFinder.cs:line 179
   at System.Linq.Enumerable.ArrayWhereIterator`1.ToArray(ReadOnlySpan`1 source, Func`2 predicate)
   at System.Linq.Dynamic.Core.Parser.SupportedMethods.MethodFinder.FindBestMethodBasedOnArguments(IEnumerable`1 methods, Expression[]& args, MethodBase& method) in C:\dev\GitHub\System.Linq.Dynamic.Core\src\System.Linq.Dynamic.Core\Parser\SupportedMethods\MethodFinder.cs:line 179
   at System.Linq.Dynamic.Core.Parser.SupportedMethods.MethodFinder.FindMethod(Type type, String methodName, Boolean staticAccess, Expression& instance, Expression[]& args, MethodBase& method) in C:\dev\GitHub\System.Linq.Dynamic.Core\src\System.Linq.Dynamic.Core\Parser\SupportedMethods\MethodFinder.cs:line 115
   at System.Linq.Dynamic.Core.Parser.ExpressionParser.ParseMemberAccess(Type type, Expression expression, String id) in C:\dev\GitHub\System.Linq.Dynamic.Core\src\System.Linq.Dynamic.Core\Parser\ExpressionParser.cs:line 1948
   at System.Linq.Dynamic.Core.Parser.ExpressionParser.ParseTypeAccess(Type type, Boolean getNext) in C:\dev\GitHub\System.Linq.Dynamic.Core\src\System.Linq.Dynamic.Core\Parser\ExpressionParser.cs:line 1842
   at System.Linq.Dynamic.Core.Parser.ExpressionParser.ParseIdentifier() in C:\dev\GitHub\System.Linq.Dynamic.Core\src\System.Linq.Dynamic.Core\Parser\ExpressionParser.cs:line 1091
   at System.Linq.Dynamic.Core.Parser.ExpressionParser.ParsePrimaryStart() in C:\dev\GitHub\System.Linq.Dynamic.Core\src\System.Linq.Dynamic.Core\Parser\ExpressionParser.cs:line 887
   at System.Linq.Dynamic.Core.Parser.ExpressionParser.ParsePrimary() in C:\dev\GitHub\System.Linq.Dynamic.Core\src\System.Linq.Dynamic.Core\Parser\ExpressionParser.cs:line 855
   at System.Linq.Dynamic.Core.Parser.ExpressionParser.ParseUnary() in C:\dev\GitHub\System.Linq.Dynamic.Core\src\System.Linq.Dynamic.Core\Parser\ExpressionParser.cs:line 850
   at System.Linq.Dynamic.Core.Parser.ExpressionParser.ParseArithmetic() in C:\dev\GitHub\System.Linq.Dynamic.Core\src\System.Linq.Dynamic.Core\Parser\ExpressionParser.cs:line 795
   at System.Linq.Dynamic.Core.Parser.ExpressionParser.ParseAdditive() in C:\dev\GitHub\System.Linq.Dynamic.Core\src\System.Linq.Dynamic.Core\Parser\ExpressionParser.cs:line 742
   at System.Linq.Dynamic.Core.Parser.ExpressionParser.ParseShiftOperator() in C:\dev\GitHub\System.Linq.Dynamic.Core\src\System.Linq.Dynamic.Core\Parser\ExpressionParser.cs:line 718
   at System.Linq.Dynamic.Core.Parser.ExpressionParser.ParseComparisonOperator() in C:\dev\GitHub\System.Linq.Dynamic.Core\src\System.Linq.Dynamic.Core\Parser\ExpressionParser.cs:line 514
   at System.Linq.Dynamic.Core.Parser.ExpressionParser.ParseLogicalAndOrOperator() in C:\dev\GitHub\System.Linq.Dynamic.Core\src\System.Linq.Dynamic.Core\Parser\ExpressionParser.cs:line 446
   at System.Linq.Dynamic.Core.Parser.ExpressionParser.ParseIn() in C:\dev\GitHub\System.Linq.Dynamic.Core\src\System.Linq.Dynamic.Core\Parser\ExpressionParser.cs:line 344
   at System.Linq.Dynamic.Core.Parser.ExpressionParser.ParseAndOperator() in C:\dev\GitHub\System.Linq.Dynamic.Core\src\System.Linq.Dynamic.Core\Parser\ExpressionParser.cs:line 328
   at System.Linq.Dynamic.Core.Parser.ExpressionParser.ParseOrOperator() in C:\dev\GitHub\System.Linq.Dynamic.Core\src\System.Linq.Dynamic.Core\Parser\ExpressionParser.cs:line 310
   at System.Linq.Dynamic.Core.Parser.ExpressionParser.ParseLambdaOperator() in C:\dev\GitHub\System.Linq.Dynamic.Core\src\System.Linq.Dynamic.Core\Parser\ExpressionParser.cs:line 288
   at System.Linq.Dynamic.Core.Parser.ExpressionParser.ParseNullCoalescingOperator() in C:\dev\GitHub\System.Linq.Dynamic.Core\src\System.Linq.Dynamic.Core\Parser\ExpressionParser.cs:line 275
   at System.Linq.Dynamic.Core.Parser.ExpressionParser.ParseConditionalOperator() in C:\dev\GitHub\System.Linq.Dynamic.Core\src\System.Linq.Dynamic.Core\Parser\ExpressionParser.cs:line 259
   at System.Linq.Dynamic.Core.Parser.ExpressionParser.Parse(Type resultType, Boolean createParameterCtor) in C:\dev\GitHub\System.Linq.Dynamic.Core\src\System.Linq.Dynamic.Core\Parser\ExpressionParser.cs:line 174
   at Program.<Main>$(String[] args)
Command terminated by signal 6

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

Labels

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions