{"record":{"id":"f73f6044c3968e82","repo":"stride3d/stride","slug":"paramkey","errorCode":null,"errorMessage":"paramKey","messagePattern":"paramKey","errorType":"validation","errorClass":"ArgumentNullException","httpStatus":null,"severity":"error","filePath":"sources/shaders/Stride.Shaders.Effects/ShaderMixinContext.cs","lineNumber":100,"sourceCode":"            }\n        }\n\n        public void Discard()\n        {\n            throw new ShaderMixinDiscardException();\n        }\n\n        /// <summary>\n        /// Gets a parameter value for the specified key.\n        /// </summary>\n        /// <typeparam name=\"T\">Type of the parameter value</typeparam>\n        /// <param name=\"paramKey\">The parameter key.</param>\n        /// <returns>The value or default value associated to this parameter key.</returns>\n        /// <exception cref=\"System.ArgumentNullException\">key</exception>\n        public T GetParam<T>(PermutationParameterKey<T> paramKey)\n        {\n            if (paramKey == null)\n                throw new ArgumentNullException(\"paramKey\");\n\n            var globalKey = paramKey;\n            var composeKey = GetComposeKey(paramKey);\n            var selectedKey = globalKey;\n            ParameterCollection sourceParameters = null;\n\n            // Try first if a composite key with a value is available for the key\n            if (composeKey != globalKey)\n            {\n                sourceParameters = FindKeyValue(composeKey, out selectedKey);\n            }\n\n            // Else try using global key\n            if (sourceParameters == null)\n            {\n                sourceParameters = FindKeyValue(globalKey, out selectedKey);\n            }\n","sourceCodeStart":82,"sourceCodeEnd":118,"githubUrl":"https://github.com/stride3d/stride/blob/96fad776d210c221682aac1ccdf4c79dc046fc38/sources/shaders/Stride.Shaders.Effects/ShaderMixinContext.cs#L82-L118","documentation":"GetParam<T> throws ArgumentNullException(\"paramKey\") when the PermutationParameterKey<T> used to look up a shader permutation parameter is null. The key is required to compute the global, composition, and selected keys for the lookup. Fail-fast guard before any parameter resolution happens.","triggerScenarios":"Calling ctx.GetParam<T>(null) — usually when the key was retrieved from a dictionary/registry that lacked the entry and the null result was passed directly.","commonSituations":"Referencing a permutation key by string name that doesn't exist; keys defined in a different shader version no longer present after an upgrade.","solutions":["Pass a valid PermutationParameterKey<T> instance (e.g. MyShader.Permutation.PositionInput)","Verify the key exists in the shader's permutation keys after version changes","Add a null check before calling GetParam"],"exampleFix":"// before\nvar value = context.GetParam(FindKey(name)); // FindKey may return null\n// after\nvar key = FindKey(name);\nif (key != null) { var value = context.GetParam(key); }","handlingStrategy":"validation","validationCode":"if (paramKey is null) throw new InvalidOperationException(\"Permutation key not found\");\nvar value = context.GetParam(paramKey);","typeGuard":"static bool IsValidKey<T>(PermutationParameterKey<T> k) => k != null;","tryCatchPattern":"try { var value = context.GetParam(key); }\ncatch (ArgumentNullException) { throw new InvalidOperationException($\"Unknown permutation key '{name}'\"); }","preventionTips":["Reference permutation keys directly from the generated shader class (e.g. MyShader.Permutation.X)","Re-check key names after upgrading shaders","Wrap dynamic key resolution with null checks"],"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"}