{"record":{"id":"a438f5ac70502af3","repo":"dotnet/wpf","slug":"opening-bracket-character-cannot-be-the-same-as-closing","errorCode":null,"errorMessage":"Opening bracket character cannot be the same as closing bracket character.","messagePattern":"Opening bracket character cannot be the same as closing bracket character\\.","errorType":"exception","errorClass":"InvalidOperationException","httpStatus":null,"severity":"error","filePath":"src/Microsoft.DotNet.Wpf/src/Shared/MS/Internal/Xaml/Parser/SpecialBracketCharacters.cs","lineNumber":76,"sourceCode":"            {\n                foreach (char openingBracket in attributeList.Keys)\n                {\n                    char closingBracket = attributeList[openingBracket];\n                    string errorMessage = string.Empty;\n                    if (IsValidBracketCharacter(openingBracket, closingBracket))\n                    {\n                        _startCharactersStringBuilder.Append(openingBracket);\n                        _endCharactersStringBuilder.Append(closingBracket);\n                    }\n                }\n            }\n        }\n\n        private bool IsValidBracketCharacter(char openingBracket, char closingBracket)\n        {\n            if (openingBracket == closingBracket)\n            {\n                throw new InvalidOperationException(\"Opening bracket character cannot be the same as closing bracket character.\");\n            }\n            else if (char.IsLetterOrDigit(openingBracket) || char.IsLetterOrDigit(closingBracket) || char.IsWhiteSpace(openingBracket) || char.IsWhiteSpace(closingBracket))\n            {\n                throw new InvalidOperationException(\"Bracket characters cannot be alpha-numeric or whitespace.\");\n            }\n            else if (_restrictedCharSet.Contains(openingBracket) || _restrictedCharSet.Contains(closingBracket))\n            {\n                throw new InvalidOperationException(\"Bracket characters cannot be one of the following: '=' , ',', '\\'', '\\\"', '{ ', ' }', '\\\\'\");\n            }\n            else\n            {\n                return true;\n            }\n        }\n\n        internal bool IsSpecialCharacter(char ch)\n        {\n            return _startChars.Contains(ch.ToString()) || _endChars.Contains(ch.ToString());","sourceCodeStart":58,"sourceCodeEnd":94,"githubUrl":"https://github.com/dotnet/wpf/blob/81131a70a4c573cd62748a5c36908fc4d662daa9/src/Microsoft.DotNet.Wpf/src/Shared/MS/Internal/Xaml/Parser/SpecialBracketCharacters.cs#L58-L94","documentation":"IsValidBracketCharacter (called from Tokenize) throws when the opening and closing bracket characters are identical. The tokenizer needs distinct characters to bracket a delimited region; an identical pair would make tokenization ambiguous and is rejected eagerly with a descriptive message.","triggerScenarios":"Tokenize runs over an attribute list where a dictionary entry maps a char to the same char as its key, e.g. new Dictionary<char,char>{['|']='|'} — opening == closing triggers this throw.","commonSituations":"Custom bracket configuration where a developer intends a symmetric delimiter like |...| but the API requires asymmetric pairs; or a config table was built programmatically with key == value by mistake.","solutions":["Change the bracket pair so opening and closing characters differ (e.g. '[' and ']')","Audit the Dictionary<char,char> source for entries where key equals value","Add a pre-check before registering: if (open == close) choose a different closing character"],"exampleFix":"// before\nvar map = new Dictionary<char, char> { ['|'] = '|' };\n// after\nvar map = new Dictionary<char, char> { ['|'] = '|' }; // unsupported\n// use an asymmetric pair instead:\nvar map = new Dictionary<char, char> { ['|'] = ';' };","handlingStrategy":"validation","validationCode":"if (open == close) throw new ArgumentException(\"Opening and closing bracket characters must differ.\");","typeGuard":null,"tryCatchPattern":"try { tokenize(map); }\ncatch (InvalidOperationException ex) when (ex.Message.Contains(\"same as closing\")) { /* fix config: reject symmetric pairs */ }","preventionTips":["Assert open != close when building the bracket dictionary","Avoid symmetric delimiters; the API requires distinct open/close chars"],"tags":["wpf","xaml","validation"],"backgroundTag":"invalid-argument-value","analyzedSha":"81131a70a4c573cd62748a5c36908fc4d662daa9","analyzedAt":"2026-09-14T10:12:48.479Z","contentChangedAt":"2026-09-14T10:12:48.479Z","schemaVersion":2},"datasetVersion":"2026-09-22T01:17:13.364Z"}