{"record":{"id":"87b464df607412e8","repo":"AvaloniaUI/Avalonia","slug":"optional-has-no-value","errorCode":null,"errorMessage":"Optional has no value.","messagePattern":"Optional has no value\\.","errorType":"exception","errorClass":"InvalidOperationException","httpStatus":null,"severity":"error","filePath":"src/Avalonia.Base/Data/Optional.cs","lineNumber":47,"sourceCode":"        /// <param name=\"value\">The value.</param>\n        public Optional(T value)\n        {\n            _value = value;\n            HasValue = true;\n        }\n\n        /// <summary>\n        /// Gets a value indicating whether a value is present.\n        /// </summary>\n        public bool HasValue { get; }\n\n        /// <summary>\n        /// Gets the value.\n        /// </summary>\n        /// <exception cref=\"InvalidOperationException\">\n        /// <see cref=\"HasValue\"/> is false.\n        /// </exception>\n        public T Value => HasValue ? _value : throw new InvalidOperationException(\"Optional has no value.\");\n\n        /// <inheritdoc/>\n        public override bool Equals(object? obj) => obj is Optional<T> o && this == o;\n\n        /// <inheritdoc/>\n        public bool Equals(Optional<T> other) => this == other;\n\n        /// <inheritdoc/>\n        public override int GetHashCode() => HasValue ? _value?.GetHashCode() ?? 0 : 0;\n\n        /// <summary>\n        /// Casts the value (if any) to an <see cref=\"object\"/>.\n        /// </summary>\n        /// <returns>The cast optional value.</returns>\n        public Optional<object?> ToObject() => HasValue ? new Optional<object?>(_value) : default;\n\n        /// <inheritdoc/>\n        public override string ToString() => HasValue ? _value?.ToString() ?? \"(null)\" : \"(empty)\";","sourceCodeStart":29,"sourceCodeEnd":65,"githubUrl":"https://github.com/AvaloniaUI/Avalonia/blob/11c542726898ae954a1ef668c65ec79ec92ab17d/src/Avalonia.Base/Data/Optional.cs#L29-L65","documentation":"Optional<T> is an either-or container (like Nullable<T> but it accepts reference types). Accessing .Value when HasValue is false is invalid because there is no stored value. The struct throws InvalidOperationException to mirror Nullable<T>.Value semantics.","triggerScenarios":"Reading `optional.Value` on a default/empty Optional<T> (e.g. `default(Optional<T>)` or `Optional<T>.Empty`), or after an operation that returned an empty optional.","commonSituations":"Binding value lookups, converter inputs, or property metadata that return Optional<T>.Empty, then code blindly reads .Value. Default struct initialization leaves HasValue=false.","solutions":["Check `optional.HasValue` before accessing `.Value`.","Use pattern matching: `if (opt.HasValue) { ... opt.Value ... }`.","Provide a fallback with `opt.HasValue ? opt.Value : defaultValue`."],"exampleFix":"// before:\nvar x = optional.Value; // throws if empty\n\n// after:\nif (optional.HasValue)\n    Use(optional.Value);\nelse\n    Use(fallback);\n// or:\nvar x = optional.HasValue ? optional.Value : default(T);","handlingStrategy":"type-guard","validationCode":"if (!optional.HasValue) return fallback;\nvar v = optional.Value;","typeGuard":"static bool IsPresent<T>(Optional<T> o) => o.HasValue;","tryCatchPattern":"try { var v = optional.Value; }\ncatch (InvalidOperationException) { /* no value; use default */ }","preventionTips":["Always check HasValue before reading Value.","Treat default(Optional<T>) as empty.","Prefer GetValueOrDefault-style fallbacks."],"tags":["optional","nullable","invalidoperation","data"],"backgroundTag":null,"analyzedSha":"11c542726898ae954a1ef668c65ec79ec92ab17d","analyzedAt":"2026-08-13T11:57:40.261Z","schemaVersion":2},"datasetVersion":"2026-08-13T14:17:21.547Z"}