{"record":{"id":"6f08d7dba412fbe8","repo":"dotnet/maui","slug":"unhandled-expression-type-0","errorCode":null,"errorMessage":"Unhandled expression type: '{0}'","messagePattern":"Unhandled expression type: '(.+?)'","errorType":"exception","errorClass":"ArgumentException","httpStatus":null,"severity":"error","filePath":"src/Compatibility/Core/src/WPF/WPFExpressionSearch.cs","lineNumber":121,"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":103,"sourceCodeEnd":139,"githubUrl":"https://github.com/dotnet/maui/blob/f377ff1c5ee04d334d8a925f50c83a6b7afddf03/src/Compatibility/Core/src/WPF/WPFExpressionSearch.cs#L103-L139","documentation":"Thrown by WPFExpressionSearch.Visit when the expression-tree visitor encounters an ExpressionType not covered by its switch statement (it handles Lambda, MemberAccess, Call, New, arrays, MemberInit, ListInit, Conditional, Invoke, Constant). Any other node type — e.g. Coalesce, TypeIs, Convert with custom logic, Quote — falls through to the default throw.","triggerScenarios":"Passing a LINQ expression (e.g., for data binding or FindByName) to WPFExpressionSearch that contains an unsupported ExpressionType. For example, a null-coalescing operator (??) produces ExpressionType.Coalesce, which is not handled.","commonSituations":"Using complex LINQ expressions in binding helpers or FindByName calls on WPF; expressions using operators like ??, is, or complex conditional constructs that the visitor was not written to traverse.","solutions":["Simplify the expression to use only supported node types (member access, method calls, lambdas, conditionals).","Avoid null-coalescing (??) and type-test (is) operators in expressions passed to the visitor.","If a specific ExpressionType is needed, extend WPFExpressionSearch.Visit with an additional case."],"exampleFix":"// before\nExpression<Func<ViewModel, string>> expr = vm => vm.Name ?? \"default\";\nvar search = new WPFExpressionSearch();\nvar names = search.FindMembers(expr);\n\n// after — avoid ?? which produces Coalesce (unsupported)\nExpression<Func<ViewModel, string>> expr = vm => vm.Name;\nvar names = search.FindMembers(expr);","handlingStrategy":"validation","validationCode":"static readonly HashSet<ExpressionType> Supported = new()\n{\n    ExpressionType.Lambda, ExpressionType.MemberAccess, ExpressionType.Call,\n    ExpressionType.New, ExpressionType.NewArrayInit, ExpressionType.NewArrayBounds,\n    ExpressionType.Invoke, ExpressionType.MemberInit, ExpressionType.ListInit,\n    ExpressionType.Conditional, ExpressionType.Constant\n};\nbool IsSupported(Expression expr) => Supported.Contains(expr.NodeType);","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Keep expressions passed to WPFExpressionSearch simple — avoid ??, is, and other exotic operators.","Unit-test expressions against the visitor before using them in production binding code."],"tags":["wpf","expressions","linq","expression-tree","visitor-pattern"],"backgroundTag":null,"analyzedSha":"f377ff1c5ee04d334d8a925f50c83a6b7afddf03","analyzedAt":"2026-08-13T14:26:18.069Z","schemaVersion":2},"datasetVersion":"2026-08-13T19:17:28.613Z"}