{"record":{"id":"e67fc85a92f9b62e","repo":"dotnet/wpf","slug":"sr-xamlmarkupextensionwritercannotwritenonstringvalue","errorCode":null,"errorMessage":"SR.XamlMarkupExtensionWriterCannotWriteNonstringValue","messagePattern":"SR\\.XamlMarkupExtensionWriterCannotWriteNonstringValue","errorType":"exception","errorClass":"ArgumentException","httpStatus":null,"severity":"error","filePath":"src/Microsoft.DotNet.Wpf/src/System.Xaml/System/Xaml/XamlMarkupExtensionWriter.cs","lineNumber":177,"sourceCode":"        {\n            currentState.WriteStartMember(this, property);\n        }\n\n        public override void WriteEndMember()\n        {\n            currentState.WriteEndMember(this);\n        }\n\n        public override void WriteNamespace(NamespaceDeclaration namespaceDeclaration)\n        {\n            currentState.WriteNamespace(this, namespaceDeclaration);\n        }\n\n        public override void WriteValue(object value)\n        {\n            if (value is not string s)\n            {\n                throw new ArgumentException(SR.XamlMarkupExtensionWriterCannotWriteNonstringValue);\n            }\n\n            currentState.WriteValue(this, s);\n        }\n\n        private class Node\n        {\n            public XamlMember XamlProperty\n            {\n                get;\n                set;\n            }\n\n            public XamlPropertySet Members\n            {\n                get;\n                set;\n            }","sourceCodeStart":159,"sourceCodeEnd":195,"githubUrl":"https://github.com/dotnet/wpf/blob/81131a70a4c573cd62748a5c36908fc4d662daa9/src/Microsoft.DotNet.Wpf/src/System.Xaml/System/Xaml/XamlMarkupExtensionWriter.cs#L159-L195","documentation":"XamlMarkupExtensionWriter translates XAML node streams into the '{MarkupExtension ...}' string form. Its WriteValue override only accepts strings because the textual serialization layer can only append string tokens; any other CLR value type would corrupt the output. .NET throws ArgumentException with resource key XamlMarkupExtensionWriterCannotWriteNonstringValue for any non-string value.","triggerScenarios":"Calling XamlMarkupExtensionWriter.WriteValue(object) with a value that is not a System.String — e.g. an int, double, bool, enum, or object instance — typically when copying nodes from a XamlReader stream and forwarding the node value verbatim.","commonSituations":"Writing a generic XAML-to-markup-extension converter that replays node streams; numeric or boolean property values inside a markup extension such as '{StaticResource 5}' or '{x:Static SomeBool}'; adapters that assume WriteValue takes any object like most XamlWriter implementations do.","solutions":["Convert the value to its string form before calling WriteValue, e.g. using TypeConverter or Convert.ToString / culture-invariant formatting","Check `if (value is string)` before forwarding and handle non-strings via a TypeConverter for the member's XamlType","If copying from a XamlXmlReader/XamlObjectReader stream, only forward string values; for Value nodes of other types, resolve the member's type converter first"],"exampleFix":"// before\nwriter.WriteValue(node.Value); // Value is boxed int 42\n// after\nvar s = node.Value as string ?? TypeConverterFor(member).ConvertToInvariantString(node.Value);\nwriter.WriteValue(s);","handlingStrategy":"type-guard","validationCode":"if (value is not string s)\n    s = ResolveStringViaTypeConverter(member, value); // convert before writing\nwriter.WriteValue(s);","typeGuard":"static bool IsWritableValue(object v) => v is string;","tryCatchPattern":"try { writer.WriteValue(v); }\ncatch (ArgumentException ex) when (ex.Message.Contains(\"non-string\") || ex.Message.Contains(\"XamlMarkupExtensionWriter\")) { /* convert to string and retry */ }","preventionTips":["Always convert node values to strings (culture-invariant) before WriteValue in a markup extension writer","Remember this writer only accepts strings, unlike generic XamlWriter implementations","Test with numeric/bool/enum values inside markup extensions"],"tags":["xaml","argument-exception","type-mismatch"],"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"}