{"record":{"id":"c5cdd5f281b62759","repo":"dotnet/maui","slug":"unhandled-expression-type-0-c5cdd5","errorCode":null,"errorMessage":"Unhandled expression type: '{0}'","messagePattern":"Unhandled expression type: '(.+?)'","errorType":"exception","errorClass":"ArgumentException","httpStatus":null,"severity":"error","filePath":"src/Compatibility/Core/src/Windows/WindowsExpressionSearch.cs","lineNumber":119,"sourceCode":"\t\t\t\tcase ExpressionType.Invoke:\n\t\t\t\t\tvar invocation = (InvocationExpression)expression;\n\t\t\t\t\tVisitList(invocation.Arguments, Visit);\n\t\t\t\t\tVisit(invocation.Expression);\n\t\t\t\t\tbreak;\n\t\t\t\tcase ExpressionType.MemberInit:\n\t\t\t\t\tvar init = (MemberInitExpression)expression;\n\t\t\t\t\tVisitList(init.NewExpression.Arguments, Visit);\n\t\t\t\t\tVisitList(init.Bindings, VisitBinding);\n\t\t\t\t\tbreak;\n\t\t\t\tcase ExpressionType.ListInit:\n\t\t\t\t\tvar init1 = (ListInitExpression)expression;\n\t\t\t\t\tVisitList(init1.NewExpression.Arguments, Visit);\n\t\t\t\t\tVisitList(init1.Initializers, initializer => VisitList(initializer.Arguments, Visit));\n\t\t\t\t\tbreak;\n\t\t\t\tcase ExpressionType.Constant:\n\t\t\t\t\tbreak;\n\t\t\t\tdefault:\n\t\t\t\t\tthrow new ArgumentException(string.Format(\"Unhandled expression type: '{0}'\", expression.NodeType));\n\t\t\t}\n\t\t}\n\n\t\tvoid VisitBinding(MemberBinding binding)\n\t\t{\n\t\t\tswitch (binding.BindingType)\n\t\t\t{\n\t\t\t\tcase MemberBindingType.Assignment:\n\t\t\t\t\tVisit(((MemberAssignment)binding).Expression);\n\t\t\t\t\tbreak;\n\t\t\t\tcase MemberBindingType.MemberBinding:\n\t\t\t\t\tVisitList(((MemberMemberBinding)binding).Bindings, VisitBinding);\n\t\t\t\t\tbreak;\n\t\t\t\tcase MemberBindingType.ListBinding:\n\t\t\t\t\tVisitList(((MemberListBinding)binding).Initializers, initializer => VisitList(initializer.Arguments, Visit));\n\t\t\t\t\tbreak;\n\t\t\t\tdefault:\n\t\t\t\t\tthrow new ArgumentException(string.Format(\"Unhandled binding type '{0}'\", binding.BindingType));","sourceCodeStart":101,"sourceCodeEnd":137,"githubUrl":"https://github.com/dotnet/maui/blob/f377ff1c5ee04d334d8a925f50c83a6b7afddf03/src/Compatibility/Core/src/Windows/WindowsExpressionSearch.cs#L101-L137","documentation":"WindowsExpressionSearch.Visit throws ArgumentException for expression tree node types not handled in its switch statement. The visitor handles unary, binary, member access, lambda, call, invoke, member init, list init, and constant types, but throws for any other ExpressionType (e.g. Conditional, Coalesce, Switch, Try, Block, NewArray, Index, etc.).","triggerScenarios":"A binding expression or lambda passed through the expression search contains a node type the visitor does not handle — e.g. a ternary conditional expression (a ? b : c), null-coalescing (a ?? b), array creation, or dynamic expressions in a data binding path.","commonSituations":"Complex multi-binding with conditional logic in XAML; advanced lambda expressions in binding definitions; newer C# expression patterns not anticipated by the visitor.","solutions":["Simplify binding expressions to use only property access, method calls, and arithmetic operations","Replace conditional expressions with value converters","Pre-compute values in the ViewModel instead of using complex expressions in bindings"],"exampleFix":"// before — conditional expression triggers unhandled ExpressionType.Conditional\nSetBinding(MyProperty, new Binding(() => flag ? value1 : value2));\n\n// after — use a value converter or pre-computed property\nSetBinding(MyProperty, new Binding(nameof(ViewModel.ComputedValue)));","handlingStrategy":"try-catch","validationCode":"// Before using complex expressions in bindings, check the node type\nstatic bool IsSupportedExpression(Expression expr)\n{\n    var supported = new[]\n    {\n        ExpressionType.MemberAccess, ExpressionType.Constant, ExpressionType.Call,\n        ExpressionType.Invoke, ExpressionType.Lambda, ExpressionType.Convert,\n        ExpressionType.Add, ExpressionType.Subtract, ExpressionType.Multiply,\n        ExpressionType.Divide, ExpressionType.Parameter\n    };\n    return supported.Contains(expr.NodeType);\n}","typeGuard":null,"tryCatchPattern":"try\n{\n    SetBinding(MyViewProperty, new Binding(() => complexExpression));\n}\ncatch (ArgumentException ex) when (ex.Message.Contains(\"Unhandled expression type\"))\n{\n    // Fall back to a simpler binding or pre-computed value\n    SetBinding(MyViewProperty, new Binding(nameof(ViewModel.SimpleValue)));\n}","preventionTips":["Keep binding expressions simple — property access and basic arithmetic only","Avoid conditional, coalesce, and ternary expressions in lambda-based bindings","Move complex logic to ViewModel properties or value converters","Test binding expressions on Windows specifically, since the expression visitor differs by platform"],"tags":["expression-trees","data-binding","winui","internal"],"backgroundTag":null,"analyzedSha":"f377ff1c5ee04d334d8a925f50c83a6b7afddf03","analyzedAt":"2026-08-13T14:26:18.069Z","schemaVersion":2},"datasetVersion":"2026-08-13T19:17:28.613Z"}