{"record":{"id":"5d716fbb50385d8e","repo":"clockworklabs/SpacetimeDB","slug":"unknown-result-variant","errorCode":null,"errorMessage":"Unknown Result variant.","messagePattern":"Unknown Result variant\\.","errorType":"exception","errorClass":"InvalidOperationException","httpStatus":null,"severity":"warning","filePath":"crates/bindings-csharp/BSATN.Runtime/Builtins.cs","lineNumber":662,"sourceCode":"            OkR(var v) => onOk(v),\n            ErrR(var e) => onErr(e),\n            _ => throw new InvalidOperationException(\"Unknown Result variant.\"),\n        };\n\n    public static Result<T, E> Ok(T value) => new OkR(value);\n\n    public static Result<T, E> Err(E error) => new ErrR(error);\n\n    public T UnwrapOrThrow()\n    {\n        return this switch\n        {\n            OkR(var v) => v,\n            ErrR(var e) when e is not null => throw new Exception(e.ToString()),\n            ErrR(_) => throw new InvalidOperationException(\n                \"Result failed without an error object.\"\n            ),\n            _ => throw new InvalidOperationException(\"Unknown Result variant.\"),\n        };\n    }\n\n    public T UnwrapOr(T defaultValue) =>\n        this switch\n        {\n            OkR(var v) => v,\n            _ => defaultValue,\n        };\n\n    public T UnwrapOrElse(Func<E, T> f) =>\n        this switch\n        {\n            OkR(var v) => v,\n            ErrR(var e) => f(e),\n            _ => throw new InvalidOperationException(\"Unknown Result variant.\"),\n        };\n","sourceCodeStart":644,"sourceCodeEnd":680,"githubUrl":"https://github.com/clockworklabs/SpacetimeDB/blob/6dee26c6efc2856793e12b148a59742964f5d783/crates/bindings-csharp/BSATN.Runtime/Builtins.cs#L644-L680","documentation":"Defensive default arm of Result<T,E>.UnwrapOrThrow() in the C# BSATN runtime. The switch already handles both sealed variants OkR and ErrR; the `_` arm only executes if `this` is neither, which cannot happen through the public API because OkR/ErrR are the only nested records and Ok/Err are the only constructors. Reaching it requires a third Result subtype, which is only possible via a user-added partial declaration of `partial record Result<T,E>` or reflection magic.","triggerScenarios":"Declaring an additional `public sealed record MyVariant : Result<T,E>` via the partial record and calling UnwrapOrThrow() on it; a forked/modified BSATN.Runtime that adds a variant without updating the switch; theoretically a corrupted object state from unsafe code.","commonSituations":"Almost never seen in the wild; when it is, it follows a library upgrade where a local partial extension of Result conflicted with a new runtime version, or debug builds with patched/instrumented assemblies.","solutions":["Search your codebase for extra `partial record Result<` declarations or subclasses of Result and remove them","Use only Result.Ok()/Result.Err() and the implicit conversions to construct Results","If it reproduces with stock SpacetimeDB packages, file a bindings bug with the stack trace"],"exampleFix":null,"handlingStrategy":"type-guard","validationCode":null,"typeGuard":"static bool IsKnownVariant<T, E>(Result<T, E> r) =>\n    r is Result<T, E>.OkR or Result<T, E>.ErrR;","tryCatchPattern":"try { var v = result.UnwrapOrThrow(); }\ncatch (InvalidOperationException ioe) when (ioe.Message == \"Unknown Result variant.\")\n{\n    // a third Result subtype exists (partial-declaration extension) — audit your codebase\n}","preventionTips":["Do not extend Result<T,E> with partial declarations or subclasses","Treat this exception as a library-contract violation and report it upstream with the stack trace"],"tags":["csharp","bsatn","result","pattern-matching","invariant"],"backgroundTag":"unreachable-default-branch","analyzedSha":"6dee26c6efc2856793e12b148a59742964f5d783","analyzedAt":"2026-08-20T06:08:37.179Z","contentChangedAt":"2026-08-20T06:08:37.179Z","schemaVersion":2},"datasetVersion":"2026-09-14T00:17:10.932Z"}