{"record":{"id":"d5820d3fee4e7341","repo":"stride3d/stride","slug":"object-must-be-a-packageversion","errorCode":null,"errorMessage":"Object must be a PackageVersion","messagePattern":"Object must be a PackageVersion","errorType":"exception","errorClass":"ArgumentException","httpStatus":null,"severity":"error","filePath":"sources/core/Stride.Core.Design/PackageVersion.cs","lineNumber":241,"sourceCode":"    }\n\n    private static Version NormalizeVersionValue(Version version)\n    {\n        return new Version(version.Major,\n            version.Minor,\n            Math.Max(version.Build, 0),\n            Math.Max(version.Revision, 0));\n    }\n\n    public int CompareTo(object? obj)\n    {\n        if (ReferenceEquals(obj, null))\n        {\n            return 1;\n        }\n        if (obj is not PackageVersion other)\n        {\n            throw new ArgumentException($\"Object must be a {nameof(PackageVersion)}\", nameof(obj));\n        }\n        return CompareTo(other);\n    }\n\n    public int CompareTo(PackageVersion? other)\n    {\n        if (ReferenceEquals(other, null))\n        {\n            return 1;\n        }\n\n        int result = Version.CompareTo(other.Version);\n\n        if (result != 0)\n        {\n            return result;\n        }\n","sourceCodeStart":223,"sourceCodeEnd":259,"githubUrl":"https://github.com/stride3d/stride/blob/96fad776d210c221682aac1ccdf4c79dc046fc38/sources/core/Stride.Core.Design/PackageVersion.cs#L223-L259","documentation":"PackageVersion implements IComparable; its non-generic CompareTo(object) accepts null (returns 1) but any non-null object that is not a PackageVersion cannot be ordered against it, so it throws an ArgumentException naming the obj parameter.","triggerScenarios":"Calling packageVersion.CompareTo(someString) or CompareTo(someOtherType) directly, or indirectly via non-generic sorting APIs (e.g. Array.Sort on object[], Comparer.Default with mixed types) that pass non-PackageVersion items.","commonSituations":"Sorting heterogeneous collections from deserialized config/manifest data where versions are strings; LINQ OrderBy on object sequences; comparing a PackageVersion to a string or Version instance by mistake.","solutions":["Convert/parse comparands to PackageVersion first (e.g. PackageVersion.Parse) then compare.","Use the generic CompareTo(PackageVersion) path or OrderBy(v => v) on a strongly typed IEnumerable<PackageVersion>.","Guard with `if (x is PackageVersion pv)` before calling CompareTo.","Use explicit Comparer<PackageVersion>.Default instead of Comparer.Default on object collections."],"exampleFix":"// before\nlist.Sort(); // list is List<object> containing strings\nversion.CompareTo(\"1.2.0\"); // throws\n// after\nvar versions = list.Cast<string>().Select(PackageVersion.Parse).ToList();\nversions.Sort();\nversion.CompareTo(PackageVersion.Parse(\"1.2.0\"));","handlingStrategy":"type-guard","validationCode":"if (other is PackageVersion pv) result = version.CompareTo(pv); else result = version.CompareTo(PackageVersion.Parse(other?.ToString() ?? \"\"));","typeGuard":"bool IsPackageVersion(object? o) => o is PackageVersion;","tryCatchPattern":"try { cmp = version.CompareTo(obj); }\ncatch (ArgumentException ex) when (ex.Message.Contains(\"PackageVersion\")) { /* convert obj via Parse, then retry */ }","preventionTips":["Keep collections strongly typed as PackageVersion","Parse strings/Version to PackageVersion before comparing","Use Comparer<PackageVersion>.Default, not Comparer.Default on object"],"tags":["csharp","comparison","type-mismatch","versioning"],"backgroundTag":"type-mismatch","analyzedSha":"96fad776d210c221682aac1ccdf4c79dc046fc38","analyzedAt":"2026-09-14T02:59:31.279Z","contentChangedAt":"2026-09-14T02:59:31.279Z","schemaVersion":2},"datasetVersion":"2026-09-15T23:17:13.987Z"}