{"record":{"id":"09a644d37b49121b","repo":"dotnet/wpf","slug":"osver-is-not-a-valid-os","errorCode":null,"errorMessage":"{osVer} is not a valid OS!","messagePattern":"(.+?) is not a valid OS!","errorType":"validation","errorClass":"ArgumentException","httpStatus":null,"severity":"warning","filePath":"src/Microsoft.DotNet.Wpf/src/Shared/System/Windows/Interop/OSVersionHelper.cs","lineNumber":248,"sourceCode":"                case OperatingSystemVersion.Windows8:\n                    return IsOsWindows8OrGreater;\n                case OperatingSystemVersion.Windows7SP1:\n                    return IsOsWindows7SP1OrGreater;\n                case OperatingSystemVersion.Windows7:\n                    return IsOsWindows7OrGreater;\n                case OperatingSystemVersion.WindowsVistaSP2:\n                    return IsOsWindowsVistaSP2OrGreater;\n                case OperatingSystemVersion.WindowsVistaSP1:\n                    return IsOsWindowsVistaSP1OrGreater;\n                case OperatingSystemVersion.WindowsVista:\n                    return IsOsWindowsVistaOrGreater;\n                case OperatingSystemVersion.WindowsXPSP3:\n                    return IsOsWindowsXPSP3OrGreater;\n                case OperatingSystemVersion.WindowsXPSP2:\n                    return IsOsWindowsXPSP2OrGreater;\n            }\n\n            throw new ArgumentException($\"{osVer} is not a valid OS!\", nameof(osVer));\n        }\n\n        internal static OperatingSystemVersion GetOsVersion()\n        {\n            if (IsOsWindows10RS5OrGreater)\n            {\n                return OperatingSystemVersion.Windows10RS5;\n            }\n            else if (IsOsWindows10RS4OrGreater)\n            {\n                return OperatingSystemVersion.Windows10RS4;\n            }\n            else if (IsOsWindows10RS3OrGreater)\n            {\n                return OperatingSystemVersion.Windows10RS3;\n            }\n            else if (IsOsWindows10RS2OrGreater)\n            {","sourceCodeStart":230,"sourceCodeEnd":266,"githubUrl":"https://github.com/dotnet/wpf/blob/81131a70a4c573cd62748a5c36908fc4d662daa9/src/Microsoft.DotNet.Wpf/src/Shared/System/Windows/Interop/OSVersionHelper.cs#L230-L266","documentation":"OSVersionHelper.IsOsVersionOrGreater maps an OperatingSystemVersion enum value to the corresponding verify-version API. If the enum value falls outside every known case (an undefined or out-of-range cast value), it throws ArgumentException(\"{osVer} is not a valid OS!\", nameof(osVer)). This guards internal callers against invalid enum values rather than silently returning false.","triggerScenarios":"Passing an OperatingSystemVersion value not present in the switch (e.g. a value cast from an int that is not a defined enum member, or an enum member added by a newer WPF but handled by an older helper).","commonSituations":"Reflection/dynamic code casting raw ints to OperatingSystemVersion; code compiled against a different WPF build than the one loaded (enum member drift); copy-pasted switch logic in forks missing a newly added case.","solutions":["Only pass values from the OperatingSystemVersion enum — never cast arbitrary ints to it.","Call OSVersionHelper.GetOsVersion() and compare the returned enum instead of hand-rolling version checks.","Update WPF references so the enum and helper come from the same build.","If extending the enum, add the matching case (and its IsOs*OrGreater property) to the switch."],"exampleFix":"// before\nvar ver = (OperatingSystemVersion)99;\nbool ok = OSVersionHelper.IsOsVersionOrGreater(ver); // throws ArgumentException\n// after\nbool ok = OSVersionHelper.IsOsVersionOrGreater(OperatingSystemVersion.Windows10RS5);","handlingStrategy":"type-guard","validationCode":"static bool IsDefinedOsVersion(OperatingSystemVersion v) => Enum.IsDefined(typeof(OperatingSystemVersion), v);","typeGuard":"static bool TryGetOsCheck(OperatingSystemVersion v, out Func<bool> check)\n{ check = null; if (!Enum.IsDefined(typeof(OperatingSystemVersion), v)) return false; check = () => OSVersionHelper.IsOsVersionOrGreater(v); return true; }","tryCatchPattern":"try { ok = OSVersionHelper.IsOsVersionOrGreater(ver); }\ncatch (ArgumentException) { ok = false; /* unknown version value */ }","preventionTips":["Never cast raw ints to OperatingSystemVersion","Use Enum.IsDefined before passing enum values across boundaries","Keep WPF reference assemblies and runtime assemblies in sync"],"tags":["argument-exception","enum","os-version","wpf"],"backgroundTag":"invalid-enum-value","analyzedSha":"81131a70a4c573cd62748a5c36908fc4d662daa9","analyzedAt":"2026-09-14T10:12:48.479Z","contentChangedAt":"2026-09-14T10:12:48.479Z","schemaVersion":2},"datasetVersion":"2026-09-21T21:30:21.729Z"}