{"record":{"id":"2f012050ccee0cf6","repo":"louthy/language-ext","slug":"option-is-not-in-a-some-state","errorCode":null,"errorMessage":"Option is not in a Some state","messagePattern":"Option is not in a Some state","errorType":"exception","errorClass":"InvalidCastException","httpStatus":null,"severity":"error","filePath":"LanguageExt.Core/Monads/Alternative Monads/Option/Option.cs","lineNumber":177,"sourceCode":"    }\n    \n    /// <summary>\n    /// Must exist here to make `operator true` work\n    /// </summary>\n    public static Option<A> operator |(Option<A> lhs, Option<A> rhs) =>\n        lhs.Choose(rhs).As();\n\n    /// <summary>\n    /// Explicit conversion operator from `Option〈A〉` to `A`\n    /// </summary>\n    /// <param name=\"a\">None value</param>\n    [Pure]\n    [MethodImpl(MethodImplOptions.AggressiveInlining)]\n    public static explicit operator A(Option<A> ma)\n    {\n        var opExplicit = ma.IsSome\n                             ? ma.Value\n                             : throw new InvalidCastException(\"Option is not in a Some state\");\n        \n        return opExplicit!;\n    }\n\n    /// <summary>\n    /// Implicit conversion operator from A to Option〈A〉\n    /// </summary>\n    /// <param name=\"a\">Unit value</param>\n    [Pure]\n    [MethodImpl(MethodImplOptions.AggressiveInlining)]\n    public static implicit operator Option<A>(A? a) =>\n        Optional(a);\n\n    /// <summary>\n    /// Implicit conversion operator from None to Option〈A〉\n    /// </summary>\n    /// <param name=\"a\">None value</param>\n    [Pure]","sourceCodeStart":159,"sourceCodeEnd":195,"githubUrl":"https://github.com/louthy/language-ext/blob/2f0e3628242889774d4141960a35671a0280051f/LanguageExt.Core/Monads/Alternative Monads/Option/Option.cs#L159-L195","documentation":"The explicit cast operator (A)Option<A> throws InvalidCastException ('Option is not in a Some state') when the Option is None. Explicit conversion is an unsafe extraction: it only works when the Option holds a value.","triggerScenarios":"Writing var x = (A)someOption; (explicit cast) on an Option<A> whose IsSome is false — i.e. a None value reaching the operator at Option.cs:177.","commonSituations":"Porting nullable-style code to Option and using casts; deserialization producing None then cast; parsed values (ParseOption) that fail silently and are later force-cast.","solutions":["Check IsSome before casting","Use ma.Match(Some: v => v, None: () => default) or IfNone(default) for safe extraction","Convert to Option's safe API surface (Bind/Map) instead of unwrapping","Catch InvalidCastException around the explicit cast if None is possible"],"exampleFix":"// before\nvar v = (int)maybeInt; // InvalidCastException when None\n\n// after\nvar v = maybeInt.IfNone(0); // or check: if (maybeInt.IsSome) { ... }","handlingStrategy":"type-guard","validationCode":"if (option.IsSome) { var v = (A)option; } else { /* None path */ }","typeGuard":"bool TryGet<A>(Option<A> ma, out A value) { value = ma.IfNone(default!); return ma.IsSome; }","tryCatchPattern":"try { var v = (A)option; }\ncatch (InvalidCastException ex) when (ex.Message == \"Option is not in a Some state\") { var v = default(A); }","preventionTips":["Never force-cast Options; use IfNone/Match","Check IsSome before explicit conversion","Handle parse failures (ParseOption) before unwrapping","Prefer Bind/Map chains over extraction"],"tags":["csharp","languageext","option","invalidcast","monad"],"backgroundTag":"type-mismatch","analyzedSha":"2f0e3628242889774d4141960a35671a0280051f","analyzedAt":"2026-09-15T03:31:55.716Z","contentChangedAt":"2026-09-15T03:31:55.716Z","schemaVersion":2},"datasetVersion":"2026-09-16T09:17:16.951Z"}