{"record":{"id":"dd62120f44da889d","repo":"stride3d/stride","slug":"unsupported-generic-resolution","errorCode":null,"errorMessage":"Unsupported generic resolution.","messagePattern":"Unsupported generic resolution\\.","errorType":"exception","errorClass":"InvalidOperationException","httpStatus":null,"severity":"error","filePath":"sources/core/Stride.Core.AssemblyProcessor/ResolveGenericsVisitor.cs","lineNumber":63,"sourceCode":"        while (parentContext != null)\n        {\n            var resolvedType = parentContext.Resolve();\n            for (int i = 0; i < resolvedType.GenericParameters.Count; ++i)\n            {\n                var genericParameter = parentContext.GetElementType().Resolve().GenericParameters[i];\n                genericTypeMapping.Add(genericParameter, genericInstanceTypeContext.GenericArguments[i]);\n            }\n            parentContext = parentContext.Resolve().BaseType;\n            if (parentContext is GenericInstanceType)\n                genericInstanceTypeContext = parentContext as GenericInstanceType;\n        }\n\n        var visitor = new ResolveGenericsVisitor(genericTypeMapping);\n        var result = visitor.VisitDynamic(type);\n\n        // Make sure type is closed now\n        if (result.ContainsGenericParameter())\n            throw new InvalidOperationException(\"Unsupported generic resolution.\");\n\n        return result;\n    }\n\n    /// <summary>\n    /// Creates a visitor that maps generic parameters from <paramref name=\"source\"/> to <paramref name=\"target\"/>.\n    /// Returns null if the source has no generic parameters.\n    /// </summary>\n    public static ResolveGenericsVisitor? FromMapping(IGenericParameterProvider source, IGenericParameterProvider target)\n    {\n        if (source.GenericParameters.Count == 0)\n            return null;\n\n        var mapping = new Dictionary<TypeReference, TypeReference>();\n        for (int i = 0; i < source.GenericParameters.Count; i++)\n            mapping[source.GenericParameters[i]] = target.GenericParameters[i];\n        return new ResolveGenericsVisitor(mapping);\n    }","sourceCodeStart":45,"sourceCodeEnd":81,"githubUrl":"https://github.com/stride3d/stride/blob/96fad776d210c221682aac1ccdf4c79dc046fc38/sources/core/Stride.Core.AssemblyProcessor/ResolveGenericsVisitor.cs#L45-L81","documentation":"ResolveGenericsVisitor closes generic types during serialization processing; after visiting, Process checks result.ContainsGenericParameter() and throws this InvalidOperationException if the type still has open generic parameters, meaning the visitor could not produce a closed type.","triggerScenarios":"Serializing a data contract whose type (or member type) is generic and cannot be fully closed by the generic type mapping — e.g. a generic class member or unbound generic parameter reaching the processor.","commonSituations":"Declaring generic fields/properties on serializable components; open generic types (e.g. typeof(List<>)) in serialized contracts; nested generics spanning assemblies the mapping doesn't cover.","solutions":["Ensure serialized member types are fully closed (List<int> not List<T>)","Avoid declaring open generic fields/properties on classes processed for serialization","Provide concrete instantiations for all generic parameters used in serializable contracts","If the pattern is legitimate, report as an AssemblyProcessor limitation and restructure the contract"],"exampleFix":"// before\nclass MyComponent<T> : SyncScript<T> { public T Data; } // open generic member\n// after\nclass MyComponent : SyncScript<MyComponent.State> { public State Data; } // closed type","handlingStrategy":"validation","validationCode":"bool IsClosed(Type t) => !t.ContainsGenericParameters;\nif (!IsClosed(memberType)) throw new InvalidOperationException(\"Serialize member types must be closed generics\");","typeGuard":"bool IsClosedGeneric(Type t) => !t.ContainsGenericParameters;","tryCatchPattern":"catch (InvalidOperationException ex) when (ex.Message == \"Unsupported generic resolution.\")\n{\n    // locate open generic member in the data contract and close it\n}","preventionTips":["Never declare open generic fields/properties on serialized classes","Use concrete type arguments for all serializable contracts","Check contracts with ContainsGenericParameters during CI"],"tags":["il-weaving","generics","serialization","assemblyprocessor"],"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"}