{"record":{"id":"b800836800ab43c6","repo":"stride3d/stride","slug":"vector-component-z-is-invalid-only-x-and-y-are-supported","errorCode":null,"errorMessage":"Vector component 'Z' is invalid, only 'X' and 'Y' are supported.","messagePattern":"Vector component 'Z' is invalid, only 'X' and 'Y' are supported\\.","errorType":"exception","errorClass":"ArgumentException","httpStatus":null,"severity":"error","filePath":"sources/editor/Stride.Assets.Presentation/CurveEditor/ViewModels/ControlPoints/VectorComponentControlPointViewModel.cs","lineNumber":29,"sourceCode":"    public abstract class VectorComponentControlPointViewModel<TValue> : KeyFrameControlPointViewModel<TValue>\n        where TValue : struct\n    {\n        protected VectorComponentControlPointViewModel([NotNull] CurveViewModelBase curve, [NotNull] IMemberNode keyNode, [NotNull] IMemberNode valueNode, [NotNull] IMemberNode tangentTypeNode, VectorComponent component) \n            : base(curve, keyNode, valueNode, tangentTypeNode)\n        {\n            Component = component;\n            SynchronizePoint();\n        }\n\n        public VectorComponent Component { get; }\n    }\n\n    public sealed class Vector2ComponentControlPointViewModel : VectorComponentControlPointViewModel<Vector2>\n    {\n        public Vector2ComponentControlPointViewModel([NotNull] CurveViewModelBase curve, [NotNull] IMemberNode keyNode, [NotNull] IMemberNode valueNode, [NotNull] IMemberNode tangentTypeNode, VectorComponent component)\n            : base(curve, keyNode, valueNode, tangentTypeNode, component)\n        {\n            if (component == VectorComponent.Z) throw new ArgumentException(\"Vector component 'Z' is invalid, only 'X' and 'Y' are supported.\", nameof(component));\n            if (component == VectorComponent.W) throw new ArgumentException(\"Vector component 'W' is invalid, only 'X' and 'Y' are supported.\", nameof(component));\n        }\n\n        protected override double GetValue()\n        {\n            switch (Component)\n            {\n                case VectorComponent.X:\n                    return ValueBinding.Value.X;\n\n                case VectorComponent.Y:\n                    return ValueBinding.Value.Y;\n\n                case VectorComponent.Z:\n                case VectorComponent.W:\n                    throw new NotSupportedException();\n\n                default:","sourceCodeStart":11,"sourceCodeEnd":47,"githubUrl":"https://github.com/stride3d/stride/blob/96fad776d210c221682aac1ccdf4c79dc046fc38/sources/editor/Stride.Assets.Presentation/CurveEditor/ViewModels/ControlPoints/VectorComponentControlPointViewModel.cs#L11-L47","documentation":"A Vector2 has only X and Y components. The Vector2ComponentControlPointViewModel constructor validates the requested VectorComponent and throws ArgumentException when Z (or W) is requested, since there is no third component to edit on a Vector2 keyframe.","triggerScenarios":"Constructing new Vector2ComponentControlPointViewModel(curve, keyNode, valueNode, tangentTypeNode, VectorComponent.Z) — typically from generic factory code that iterates components X..W without knowing the vector dimension.","commonSituations":"Generic curve-creation code sharing a component loop across Vector2/3/4; refactoring a Vector3 editor to Vector2 while keeping the Z component entry; data-driven component lists from an asset.","solutions":["Only pass VectorComponent.X or VectorComponent.Y to this constructor","Fix the factory loop to enumerate components based on the vector type (2, 3, or 4)","If migrating from Vector3 to Vector2, drop the Z component view model","Catch ArgumentException to skip invalid components in generic factories"],"exampleFix":"// before\nnew Vector2ComponentControlPointViewModel(curve, key, value, tangent, VectorComponent.Z);\n// after\nnew Vector2ComponentControlPointViewModel(curve, key, value, tangent, VectorComponent.Y);","handlingStrategy":"validation","validationCode":"if (component is VectorComponent.Z or VectorComponent.W)\n    throw new ArgumentException(\"Only X/Y valid for Vector2\", nameof(component));\nvar vm = new Vector2ComponentControlPointViewModel(curve, key, value, tangent, component);","typeGuard":"bool IsValidVector2Component(VectorComponent c) => c is VectorComponent.X or VectorComponent.Y;","tryCatchPattern":"try { vm = new Vector2ComponentControlPointViewModel(curve, key, value, tangent, component); }\ncatch (ArgumentException) { vm = null; /* skip component */ }","preventionTips":["Enumerate components per vector dimension (2 for Vector2)","Share one IsValidComponent helper across factories","Validate component lists coming from asset metadata"],"tags":["argument-exception","curve-editor","vector2"],"backgroundTag":"invalid-enum-value","analyzedSha":"96fad776d210c221682aac1ccdf4c79dc046fc38","analyzedAt":"2026-09-14T02:59:31.279Z","contentChangedAt":"2026-09-14T02:59:31.279Z","schemaVersion":2},"datasetVersion":"2026-09-23T08:17:48.524Z"}