{"record":{"id":"5b705d7ab53d06e4","repo":"App-vNext/Polly","slug":"you-have-executed-the-generic-execute-tresult-me-5b705d","errorCode":null,"errorMessage":"You have executed the generic .Execute<TResult> method on a non-generic FallbackPolicy.  A non-generic FallbackPolicy only defines a fallback action which returns void; it can never return a substitute TResult value.  To use FallbackPolicy to provide fallback TResult values you must define a generic fallback policy FallbackPolicy<TResult>.  For example, define the policy as Policy<TResult>.Handle<Whatever>.Fallback<TResult>(/* some TResult value or Func<..., TResult> */);","messagePattern":"You have executed the generic \\.Execute<TResult> method on a non-generic FallbackPolicy\\.  A non-generic FallbackPolicy only defines a fallback action which returns void; it can never return a substitute TResult value\\.  To use FallbackPolicy to provide fallback TResult values you must define a generic fallback policy FallbackPolicy<TResult>\\.  For example, define the policy as Policy<TResult>\\.Handle<Whatever>\\.Fallback<TResult>\\(/\\* some TResult value or Func<\\.\\.\\., TResult> \\*/\\);","errorType":"exception","errorClass":"InvalidOperationException","httpStatus":null,"severity":"error","filePath":"src/Polly/Fallback/FallbackPolicy.cs","lineNumber":44,"sourceCode":"            (ctx, token) =>\n            {\n                action(ctx, token);\n                return EmptyStruct.Instance;\n            },\n            context,\n            ExceptionPredicates,\n            ResultPredicates<EmptyStruct>.None,\n            (outcome, ctx) => _onFallback(outcome.Exception, ctx),\n            (outcome, ctx, ct) =>\n            {\n                _fallbackAction(outcome.Exception, ctx, ct);\n                return EmptyStruct.Instance;\n            },\n            cancellationToken);\n\n    /// <inheritdoc/>\n    protected override TResult Implementation<TResult>(Func<Context, CancellationToken, TResult> action, Context context, CancellationToken cancellationToken) =>\n        throw new InvalidOperationException($\"You have executed the generic .Execute<{nameof(TResult)}> method on a non-generic {nameof(FallbackPolicy)}.  \" +\n            $\"A non-generic {nameof(FallbackPolicy)} only defines a fallback action which returns void; it can never return a substitute {nameof(TResult)} value.  \" +\n            $\"To use {nameof(FallbackPolicy)} to provide fallback {nameof(TResult)} values you must define a generic fallback policy {nameof(FallbackPolicy)}<{nameof(TResult)}>.  \" +\n            $\"For example, define the policy as Policy<{nameof(TResult)}>.Handle<Whatever>.Fallback<{nameof(TResult)}>(/* some {nameof(TResult)} value or Func<..., {nameof(TResult)}> */);\");\n}\n\n/// <summary>\n/// A fallback policy that can be applied to delegates returning a value of type <typeparamref name=\"TResult\"/>.\n/// </summary>\n/// <typeparam name=\"TResult\">The type of the result.</typeparam>\npublic class FallbackPolicy<TResult> : Policy<TResult>, IFallbackPolicy<TResult>\n{\n    private readonly Action<DelegateResult<TResult>, Context> _onFallback;\n    private readonly Func<DelegateResult<TResult>, Context, CancellationToken, TResult> _fallbackAction;\n\n    internal FallbackPolicy(\n        PolicyBuilder<TResult> policyBuilder,\n        Action<DelegateResult<TResult>, Context> onFallback,\n        Func<DelegateResult<TResult>, Context, CancellationToken, TResult> fallbackAction)","sourceCodeStart":26,"sourceCodeEnd":62,"githubUrl":"https://github.com/App-vNext/Polly/blob/d0e46bdb1ee11ea50d0e4b6846d2633d6bc09bac/src/Polly/Fallback/FallbackPolicy.cs#L26-L62","documentation":"The synchronous sibling of the async case: calling Execute<TResult> on a non-generic FallbackPolicy throws InvalidOperationException because a void fallback action cannot produce a substitute TResult. Build a generic FallbackPolicy<TResult> via Policy<TResult>.Handle<...>().Fallback<TResult>(...) when you need to return a fallback value.","triggerScenarios":"Policy.Handle<X>().Fallback(...) (non-generic, sync) followed by policy.Execute<TResult>(...).","commonSituations":"Migrating a void synchronous fallback to a value-returning one without switching to Policy<TResult>; using a shared policy field declared as non-generic Policy for a result-returning call site.","solutions":["Use Policy<TResult>.Handle<...>().Fallback<TResult>(fallbackValue/fallbackAction, onFallback) and call Execute (non-generic TResult is inferred).","Keep non-generic FallbackPolicy paired with non-generic Execute only.","Align the declared policy variable's generic-arity with the Execute<TResult> you intend to call."],"exampleFix":"// before\nvar policy = Policy\n    .Handle<InvalidOperationException>()\n    .Fallback((ex, ctx, ct) => { /* void */ });\nint v = policy.Execute<int>(() => Compute()); // throws\n\n// after\nvar policy = Policy<int>\n    .Handle<InvalidOperationException>()\n    .Fallback(fallbackValue: 0, onFallback: outcome => { });\nint v = policy.Execute(() => Compute());","handlingStrategy":"type-guard","validationCode":"var policy = Policy<int>.Handle<InvalidOperationException>()\n    .Fallback(fallbackValue: 0, onFallback: _ => { });\nint v = policy.Execute(() => Compute());","typeGuard":"static bool IsResultFallbackPolicy(object p) => p is IFallbackPolicy<int>;","tryCatchPattern":"try { return policy.Execute<TResult>(action); } catch (InvalidOperationException ex) when (ex.Message.Contains(\"non-generic FallbackPolicy\")) { /* fix arity */ throw; }","preventionTips":["Match the Execute<TResult> arity with a Policy<TResult>-based Fallback.","Avoid sharing a non-generic Policy field across value-returning call sites.","Add a compile-time unit test exercising the value-returning Execute path."],"tags":["fallback","generics","type-mismatch","csharp","sync","legacy-api"],"backgroundTag":null,"analyzedSha":"d0e46bdb1ee11ea50d0e4b6846d2633d6bc09bac","analyzedAt":"2026-08-13T16:36:01.959Z","schemaVersion":2},"datasetVersion":"2026-08-13T19:17:28.613Z"}