Created
January 21, 2016 09:09
-
-
Save senritsu/1eb56a37575ced5f13a5 to your computer and use it in GitHub Desktop.
Razor lambda ArgumentOutOfRangeException issue
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
@using RazorLambdaBugTest.Code | |
@{ | |
// CONSTRUCTORS | |
// error | |
var testInstance1 = new TestClassWithCtor<TestClassWithProperties> | |
( | |
x => x.Foo, | |
x => x.Bar, | |
x => x.Baz | |
); | |
// error | |
var testInstance2 = new TestClassWithCtor<TestClassWithProperties> | |
(x => x.Foo, | |
x => x.Bar, | |
x => x.Baz); | |
// error in a synthetic test, but worked in production code | |
var testInstance3 = new TestClassWithCtor<TestClassWithProperties> | |
(x => x.Foo, | |
x => x.Baz); | |
// error | |
var testInstance4 = new TestClassWithCtor<TestClassWithProperties> | |
( | |
x => x.Foo, x => x.Baz); | |
// works | |
var testInstance5 = new TestClassWithCtor<TestClassWithProperties> | |
(x => x.Foo, x => x.Baz | |
); | |
// works | |
var testInstance6 = new TestClassWithCtor<TestClassWithProperties> | |
(x => x.Foo, x => x.Baz); | |
// METHODS | |
var instanceWithMethod = new TestClassWithMethod<TestClassWithProperties>(); | |
var instanceWithGenericMethod = new TestClassWithGenericMethod(); | |
// error | |
instanceWithMethod.Foo | |
( | |
x => x.Foo, | |
x => x.Bar, | |
x => x.Baz | |
); | |
instanceWithGenericMethod.Foo<TestClassWithProperties> | |
( | |
x => x.Foo, | |
x => x.Bar, | |
x => x.Baz | |
); | |
// error | |
instanceWithMethod.Foo | |
(x => x.Foo, | |
x => x.Bar, | |
x => x.Baz); | |
instanceWithGenericMethod.Foo<TestClassWithProperties> | |
(x => x.Foo, | |
x => x.Bar, | |
x => x.Baz); | |
// error | |
instanceWithMethod.Foo | |
(x => x.Foo, | |
x => x.Baz); | |
instanceWithGenericMethod.Foo<TestClassWithProperties> | |
(x => x.Foo, | |
x => x.Baz); | |
// error | |
instanceWithMethod.Foo | |
( | |
x => x.Foo, x => x.Baz); | |
instanceWithGenericMethod.Foo<TestClassWithProperties> | |
( | |
x => x.Foo, x => x.Baz); | |
// works | |
instanceWithMethod.Foo | |
(x => x.Foo, x => x.Baz | |
); | |
instanceWithGenericMethod.Foo<TestClassWithProperties> | |
(x => x.Foo, x => x.Baz | |
); | |
// works | |
instanceWithMethod.Foo | |
(x => x.Foo, x => x.Baz); | |
instanceWithGenericMethod.Foo<TestClassWithProperties> | |
(x => x.Foo, x => x.Baz); | |
// error in a synthetic test, but worked in production code | |
var instanceWithChildMethod = new TestClassWithChild | |
{ | |
Child = new TestClassWithMethod<TestClassWithProperties>() | |
}; | |
instanceWithChildMethod.Child.Foo | |
(x => x.Foo, | |
x => x.Baz); | |
} | |
Hello World |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
System.ArgumentOutOfRangeException: 'count' must be non-negative. | |
Parameter name: count | |
at System.String.CtorCharCount(Char c, Int32 count) | |
at Microsoft.AspNet.Mvc.Razor.Compilation.ExpressionRewriter.PadMemberAccess(SimpleLambdaExpressionSyntax node, IdentifierNameSyntax memberAccess) | |
at Microsoft.AspNet.Mvc.Razor.Compilation.ExpressionRewriter.VisitSimpleLambdaExpression(SimpleLambdaExpressionSyntax node) | |
at Microsoft.CodeAnalysis.CSharp.Syntax.SimpleLambdaExpressionSyntax.Accept[TResult](CSharpSyntaxVisitor`1 visitor) | |
at Microsoft.CodeAnalysis.CSharp.CSharpSyntaxRewriter.Visit(SyntaxNode node) | |
at Microsoft.CodeAnalysis.CSharp.CSharpSyntaxRewriter.VisitArgument(ArgumentSyntax node) | |
at Microsoft.CodeAnalysis.CSharp.Syntax.ArgumentSyntax.Accept[TResult](CSharpSyntaxVisitor`1 visitor) | |
at Microsoft.CodeAnalysis.CSharp.CSharpSyntaxRewriter.Visit(SyntaxNode node) | |
at Microsoft.CodeAnalysis.CSharp.CSharpSyntaxRewriter.VisitListElement[TNode](TNode node) | |
at Microsoft.CodeAnalysis.CSharp.CSharpSyntaxRewriter.VisitList[TNode](SeparatedSyntaxList`1 list) | |
at Microsoft.CodeAnalysis.CSharp.CSharpSyntaxRewriter.VisitArgumentList(ArgumentListSyntax node) | |
at Microsoft.CodeAnalysis.CSharp.Syntax.ArgumentListSyntax.Accept[TResult](CSharpSyntaxVisitor`1 visitor) | |
at Microsoft.CodeAnalysis.CSharp.CSharpSyntaxRewriter.Visit(SyntaxNode node) | |
at Microsoft.CodeAnalysis.CSharp.CSharpSyntaxRewriter.VisitObjectCreationExpression(ObjectCreationExpressionSyntax node) | |
at Microsoft.CodeAnalysis.CSharp.Syntax.ObjectCreationExpressionSyntax.Accept[TResult](CSharpSyntaxVisitor`1 visitor) | |
at Microsoft.CodeAnalysis.CSharp.CSharpSyntaxRewriter.Visit(SyntaxNode node) | |
at Microsoft.CodeAnalysis.CSharp.CSharpSyntaxRewriter.VisitEqualsValueClause(EqualsValueClauseSyntax node) | |
at Microsoft.CodeAnalysis.CSharp.Syntax.EqualsValueClauseSyntax.Accept[TResult](CSharpSyntaxVisitor`1 visitor) | |
at Microsoft.CodeAnalysis.CSharp.CSharpSyntaxRewriter.Visit(SyntaxNode node) | |
at Microsoft.CodeAnalysis.CSharp.CSharpSyntaxRewriter.VisitVariableDeclarator(VariableDeclaratorSyntax node) | |
at Microsoft.CodeAnalysis.CSharp.Syntax.VariableDeclaratorSyntax.Accept[TResult](CSharpSyntaxVisitor`1 visitor) | |
at Microsoft.CodeAnalysis.CSharp.CSharpSyntaxRewriter.Visit(SyntaxNode node) | |
at Microsoft.CodeAnalysis.CSharp.CSharpSyntaxRewriter.VisitListElement[TNode](TNode node) | |
at Microsoft.CodeAnalysis.CSharp.CSharpSyntaxRewriter.VisitList[TNode](SeparatedSyntaxList`1 list) | |
at Microsoft.CodeAnalysis.CSharp.CSharpSyntaxRewriter.VisitVariableDeclaration(VariableDeclarationSyntax node) | |
at Microsoft.CodeAnalysis.CSharp.Syntax.VariableDeclarationSyntax.Accept[TResult](CSharpSyntaxVisitor`1 visitor) | |
at Microsoft.CodeAnalysis.CSharp.CSharpSyntaxRewriter.Visit(SyntaxNode node) | |
at Microsoft.CodeAnalysis.CSharp.CSharpSyntaxRewriter.VisitLocalDeclarationStatement(LocalDeclarationStatementSyntax node) | |
at Microsoft.CodeAnalysis.CSharp.Syntax.LocalDeclarationStatementSyntax.Accept[TResult](CSharpSyntaxVisitor`1 visitor) | |
at Microsoft.CodeAnalysis.CSharp.CSharpSyntaxRewriter.Visit(SyntaxNode node) | |
at Microsoft.CodeAnalysis.CSharp.CSharpSyntaxRewriter.VisitListElement[TNode](TNode node) | |
at Microsoft.CodeAnalysis.CSharp.CSharpSyntaxRewriter.VisitList[TNode](SyntaxList`1 list) | |
at Microsoft.CodeAnalysis.CSharp.CSharpSyntaxRewriter.VisitBlock(BlockSyntax node) | |
at Microsoft.CodeAnalysis.CSharp.Syntax.BlockSyntax.Accept[TResult](CSharpSyntaxVisitor`1 visitor) | |
at Microsoft.CodeAnalysis.CSharp.CSharpSyntaxRewriter.Visit(SyntaxNode node) | |
at Microsoft.CodeAnalysis.CSharp.CSharpSyntaxRewriter.VisitMethodDeclaration(MethodDeclarationSyntax node) | |
at Microsoft.CodeAnalysis.CSharp.Syntax.MethodDeclarationSyntax.Accept[TResult](CSharpSyntaxVisitor`1 visitor) | |
at Microsoft.CodeAnalysis.CSharp.CSharpSyntaxRewriter.Visit(SyntaxNode node) | |
at Microsoft.CodeAnalysis.CSharp.CSharpSyntaxRewriter.VisitListElement[TNode](TNode node) | |
at Microsoft.CodeAnalysis.CSharp.CSharpSyntaxRewriter.VisitList[TNode](SyntaxList`1 list) | |
at Microsoft.CodeAnalysis.CSharp.CSharpSyntaxRewriter.VisitClassDeclaration(ClassDeclarationSyntax node) | |
at Microsoft.AspNet.Mvc.Razor.Compilation.ExpressionRewriter.VisitClassDeclaration(ClassDeclarationSyntax node) | |
at Microsoft.CodeAnalysis.CSharp.Syntax.ClassDeclarationSyntax.Accept[TResult](CSharpSyntaxVisitor`1 visitor) | |
at Microsoft.CodeAnalysis.CSharp.CSharpSyntaxRewriter.Visit(SyntaxNode node) | |
at Microsoft.CodeAnalysis.CSharp.CSharpSyntaxRewriter.VisitListElement[TNode](TNode node) | |
at Microsoft.CodeAnalysis.CSharp.CSharpSyntaxRewriter.VisitList[TNode](SyntaxList`1 list) | |
at Microsoft.CodeAnalysis.CSharp.CSharpSyntaxRewriter.VisitNamespaceDeclaration(NamespaceDeclarationSyntax node) | |
at Microsoft.CodeAnalysis.CSharp.Syntax.NamespaceDeclarationSyntax.Accept[TResult](CSharpSyntaxVisitor`1 visitor) | |
at Microsoft.CodeAnalysis.CSharp.CSharpSyntaxRewriter.Visit(SyntaxNode node) | |
at Microsoft.CodeAnalysis.CSharp.CSharpSyntaxRewriter.VisitListElement[TNode](TNode node) | |
at Microsoft.CodeAnalysis.CSharp.CSharpSyntaxRewriter.VisitList[TNode](SyntaxList`1 list) | |
at Microsoft.CodeAnalysis.CSharp.CSharpSyntaxRewriter.VisitCompilationUnit(CompilationUnitSyntax node) | |
at Microsoft.CodeAnalysis.CSharp.Syntax.CompilationUnitSyntax.Accept[TResult](CSharpSyntaxVisitor`1 visitor) | |
at Microsoft.CodeAnalysis.CSharp.CSharpSyntaxRewriter.Visit(SyntaxNode node) | |
at Microsoft.AspNet.Mvc.Razor.Compilation.RoslynCompilationService.Rewrite(CSharpCompilation compilation) | |
at Microsoft.AspNet.Mvc.Razor.Compilation.RoslynCompilationService.Compile(RelativeFileInfo fileInfo, String compilationContent) | |
at Microsoft.AspNet.Mvc.Razor.Compilation.RazorCompilationService.Compile(RelativeFileInfo file) | |
at Microsoft.AspNet.Mvc.Razor.Compilation.CompilerCache.CreateCacheEntry(String normalizedPath, Func`2 compile) | |
at Microsoft.AspNet.Mvc.Razor.Compilation.CompilerCache.GetOrAdd(String relativePath, Func`2 compile) | |
at Microsoft.AspNet.Mvc.Razor.VirtualPathRazorPageFactory.CreateInstance(String relativePath) | |
at Microsoft.AspNet.Mvc.Razor.RazorViewEngine.LocatePageFromViewLocations(ActionContext context, String pageName, Boolean isPartial) | |
at Microsoft.AspNet.Mvc.Razor.RazorViewEngine.GetRazorPageResult(ActionContext context, String pageName, Boolean isPartial) | |
at Microsoft.AspNet.Mvc.Razor.RazorViewEngine.FindView(ActionContext context, String viewName) | |
at Microsoft.AspNet.Mvc.ViewEngines.CompositeViewEngine.FindView(ActionContext context, String viewName, Boolean partial) | |
at Microsoft.AspNet.Mvc.ViewEngines.CompositeViewEngine.FindView(ActionContext context, String viewName) | |
at Microsoft.AspNet.Mvc.ViewFeatures.ViewResultExecutor.FindView(ActionContext actionContext, ViewResult viewResult) | |
at Microsoft.AspNet.Mvc.ViewResult.<ExecuteResultAsync>d__24.MoveNext() | |
--- End of stack trace from previous location where exception was thrown --- | |
at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) | |
at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) | |
at Microsoft.AspNet.Mvc.Controllers.FilterActionInvoker.<InvokeResultAsync>d__56.MoveNext() | |
--- End of stack trace from previous location where exception was thrown --- | |
at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) | |
at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) | |
at System.Runtime.CompilerServices.TaskAwaiter.ValidateEnd(Task task) | |
at Microsoft.AspNet.Mvc.Controllers.FilterActionInvoker.<InvokeResultFilterAsync>d__55.MoveNext() | |
--- End of stack trace from previous location where exception was thrown --- | |
at Microsoft.AspNet.Mvc.Controllers.FilterActionInvoker.<InvokeAllResultFiltersAsync>d__54.MoveNext() | |
--- End of stack trace from previous location where exception was thrown --- | |
at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) | |
at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) | |
at System.Runtime.CompilerServices.TaskAwaiter.ValidateEnd(Task task) | |
at Microsoft.AspNet.Mvc.Controllers.FilterActionInvoker.<InvokeResourceFilterAsync>d__49.MoveNext() | |
--- End of stack trace from previous location where exception was thrown --- | |
at Microsoft.AspNet.Mvc.Controllers.FilterActionInvoker.<InvokeAsync>d__44.MoveNext() | |
--- End of stack trace from previous location where exception was thrown --- | |
at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) | |
at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) | |
at Microsoft.AspNet.Mvc.Infrastructure.MvcRouteHandler.<RouteAsync>d__6.MoveNext() | |
--- End of stack trace from previous location where exception was thrown --- | |
at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) | |
at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) | |
at Microsoft.AspNet.Routing.Template.TemplateRoute.<RouteAsync>d__27.MoveNext() | |
--- End of stack trace from previous location where exception was thrown --- | |
at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) | |
at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) | |
at Microsoft.AspNet.Routing.RouteCollection.<RouteAsync>d__9.MoveNext() | |
--- End of stack trace from previous location where exception was thrown --- | |
at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) | |
at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) | |
at Microsoft.AspNet.Builder.RouterMiddleware.<Invoke>d__4.MoveNext() | |
--- End of stack trace from previous location where exception was thrown --- | |
at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) | |
at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) | |
at Microsoft.AspNet.Authentication.AuthenticationMiddleware`1.<Invoke>d__18.MoveNext() | |
--- End of stack trace from previous location where exception was thrown --- | |
at Microsoft.AspNet.Authentication.AuthenticationMiddleware`1.<Invoke>d__18.MoveNext() | |
--- End of stack trace from previous location where exception was thrown --- | |
at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) | |
at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) | |
at Microsoft.AspNet.Authentication.AuthenticationMiddleware`1.<Invoke>d__18.MoveNext() | |
--- End of stack trace from previous location where exception was thrown --- | |
at Microsoft.AspNet.Authentication.AuthenticationMiddleware`1.<Invoke>d__18.MoveNext() | |
--- End of stack trace from previous location where exception was thrown --- | |
at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) | |
at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) | |
at Microsoft.AspNet.Authentication.AuthenticationMiddleware`1.<Invoke>d__18.MoveNext() | |
--- End of stack trace from previous location where exception was thrown --- | |
at Microsoft.AspNet.Authentication.AuthenticationMiddleware`1.<Invoke>d__18.MoveNext() | |
--- End of stack trace from previous location where exception was thrown --- | |
at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) | |
at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) | |
at Microsoft.AspNet.Authentication.AuthenticationMiddleware`1.<Invoke>d__18.MoveNext() | |
--- End of stack trace from previous location where exception was thrown --- | |
at Microsoft.AspNet.Authentication.AuthenticationMiddleware`1.<Invoke>d__18.MoveNext() | |
--- End of stack trace from previous location where exception was thrown --- | |
at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) | |
at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) | |
at Microsoft.ApplicationInsights.AspNet.ExceptionTrackingMiddleware.<Invoke>d__4.MoveNext() | |
--- End of stack trace from previous location where exception was thrown --- | |
at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) | |
at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) | |
at Microsoft.AspNet.IISPlatformHandler.IISPlatformHandlerMiddleware.<Invoke>d__8.MoveNext() | |
--- End of stack trace from previous location where exception was thrown --- | |
at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) | |
at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) | |
at Microsoft.AspNet.Diagnostics.Entity.MigrationsEndPointMiddleware.<Invoke>d__5.MoveNext() | |
--- End of stack trace from previous location where exception was thrown --- | |
at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) | |
at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) | |
at Microsoft.AspNet.Diagnostics.Entity.DatabaseErrorPageMiddleware.<Invoke>d__6.MoveNext() | |
--- End of stack trace from previous location where exception was thrown --- | |
at Microsoft.AspNet.Diagnostics.Entity.DatabaseErrorPageMiddleware.<Invoke>d__6.MoveNext() | |
--- End of stack trace from previous location where exception was thrown --- | |
at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) | |
at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) | |
at Microsoft.AspNet.Diagnostics.DeveloperExceptionPageMiddleware.<Invoke>d__7.MoveNext() |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
namespace RazorLambdaBugTest.Code | |
{ | |
using System; | |
using System.Linq.Expressions; | |
public class TestClassWithProperties | |
{ | |
public int Foo { get; set; } | |
public string Bar { get; set; } | |
public double Baz { get; set; } | |
} | |
public class TestClassWithChild | |
{ | |
public TestClassWithMethod<TestClassWithProperties> Child { get; set; } | |
} | |
public class TestClassWithMethod<T> | |
{ | |
public void Foo(params Expression<Func<T, object>>[] lambdas) | |
{ | |
} | |
} | |
public class TestClassWithGenericMethod | |
{ | |
public void Foo<T>(params Expression<Func<T, object>>[] lambdas) | |
{ | |
} | |
} | |
public class TestClassWithCtor<T> | |
{ | |
public TestClassWithCtor(params Expression<Func<T, object>>[] lambdas) | |
{ | |
} | |
} | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
using Microsoft.AspNet.Mvc; | |
// For more information on enabling MVC for empty projects, visit http://go.microsoft.com/fwlink/?LinkID=397860 | |
namespace RazorLambdaBugTest.Controllers | |
{ | |
public class TestController : Controller | |
{ | |
// GET: /<controller>/ | |
public IActionResult Ctor(int id) | |
{ | |
return View($"CtorTest{id}"); | |
} | |
public IActionResult Method(int id) | |
{ | |
return View($"MethodTest{id}"); | |
} | |
public IActionResult GenericMethod(int id) | |
{ | |
return View($"GenericMethodTest{id}"); | |
} | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment