{"record":{"id":"382ec39a7f6db743","repo":"stride3d/stride","slug":"key-shadermixincontext","errorCode":null,"errorMessage":"key","messagePattern":"key","errorType":"validation","errorClass":"ArgumentNullException","httpStatus":null,"severity":"error","filePath":"sources/shaders/Stride.Shaders.Effects/ShaderMixinContext.cs","lineNumber":166,"sourceCode":"            }\n\n            return null;\n        }\n\n        private PermutationParameterKey<T> GetComposeKey<T>(PermutationParameterKey<T> key)\n        {\n            if (compositionString == null)\n            {\n                return key;\n            }\n            key = key.ComposeWith(compositionString);\n            return key;\n        }\n\n        public void SetParam<T>(PermutationParameterKey<T> key, T value)\n        {\n            if (key == null)\n                throw new ArgumentNullException(\"key\");\n\n            var propertyContainer = parameterCollections.Count > 0 ? parameterCollections.Peek() : compilerParameters;\n            Set(propertyContainer, key, value);\n        }\n\n        /// <summary>\n        /// Removes the specified mixin from this instance.\n        /// </summary>\n        /// <param name=\"mixinTree\">The mixin tree.</param>\n        /// <param name=\"name\">The name.</param>\n        public void RemoveMixin(ShaderMixinSource mixinTree, string name)\n        {\n            var mixinParent = mixinTree;\n            for (int i = mixinParent.Mixins.Count - 1; i >= 0; i--)\n            {\n                var mixin = mixinParent.Mixins[i];\n                if (mixin.ClassName == name)\n                {","sourceCodeStart":148,"sourceCodeEnd":184,"githubUrl":"https://github.com/stride3d/stride/blob/96fad776d210c221682aac1ccdf4c79dc046fc38/sources/shaders/Stride.Shaders.Effects/ShaderMixinContext.cs#L148-L184","documentation":"SetParam<T> throws ArgumentNullException(\"key\") when the PermutationParameterKey<T> used to set a shader parameter is null. The key identifies which composition/permutation parameter receives the value. Fail-fast guard before writing into the parameter collection.","triggerScenarios":"Calling ctx.SetParam<T>(null, value) — commonly when the key comes from a cache/lookup that returned null for an unknown parameter name.","commonSituations":"Renamed or removed permutation keys after shader refactors; dynamically resolved keys where the name doesn't match any declared key.","solutions":["Pass a valid PermutationParameterKey<T> (e.g. MyShaderKeys.TextureCount)","Confirm the key name matches a declared permutation key on the target shader","Guard against null keys resolved by name before calling SetParam"],"exampleFix":"// before\ncontext.SetParam(ResolveKey(\"Color\"), value); // ResolveKey may return null\n// after\nvar key = ResolveKey(\"Color\");\nif (key != null) { context.SetParam(key, value); }","handlingStrategy":"validation","validationCode":"if (key is null) throw new InvalidOperationException(\"Permutation key not found\");\ncontext.SetParam(key, value);","typeGuard":"static bool IsValidKey<T>(PermutationParameterKey<T> k) => k != null;","tryCatchPattern":"try { context.SetParam(key, value); }\ncatch (ArgumentNullException) { logger.LogWarning(\"Skipped SetParam for unknown key\"); }","preventionTips":["Use statically-typed key members from the shader class instead of name lookups","Validate resolved keys against declared permutation keys","Add unit tests covering parameter name changes"],"tags":["csharp","null-argument","generics","shaders"],"backgroundTag":"null-argument","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"}