{"record":{"id":"f8e4c0e9cb22d836","repo":"stride3d/stride","slug":"index-must-be-index-empty","errorCode":null,"errorMessage":"index must be Index.Empty.","messagePattern":"index must be Index\\.Empty\\.","errorType":"validation","errorClass":"ArgumentException","httpStatus":null,"severity":"error","filePath":"sources/presentation/Stride.Core.Quantum/MemberNode.cs","lineNumber":97,"sourceCode":"    protected void NotifyContentChanging(MemberNodeChangeEventArgs args)\n    {\n        PrepareChange?.Invoke(this, args);\n        ValueChanging?.Invoke(this, args);\n    }\n\n    /// <summary>\n    /// Raises the <see cref=\"ValueChanged\"/> event with the given arguments.\n    /// </summary>\n    /// <param name=\"args\">The arguments of the event.</param>\n    protected void NotifyContentChanged(MemberNodeChangeEventArgs args)\n    {\n        ValueChanged?.Invoke(this, args);\n        FinalizeChange?.Invoke(this, args);\n    }\n\n    protected internal override void UpdateFromMember(object newValue, NodeIndex index)\n    {\n        if (index != NodeIndex.Empty) throw new ArgumentException(\"index must be Index.Empty.\", nameof(index));\n        Update(newValue, false);\n    }\n\n    private void Update(object? newValue, bool sendNotification)\n    {\n        var oldValue = Retrieve();\n        MemberNodeChangeEventArgs? args = null;\n        if (sendNotification)\n        {\n            args = new MemberNodeChangeEventArgs(this, oldValue, newValue);\n            NotifyContentChanging(args);\n        }\n        var containerValue = Parent.Retrieve() ?? throw new InvalidOperationException(\"Container's value is null\");\n        MemberDescriptor.Set(containerValue, ConvertValue(newValue, MemberDescriptor.Type));\n\n        if (containerValue.GetType().GetTypeInfo().IsValueType)\n            ((GraphNodeBase)Parent).UpdateFromMember(containerValue, NodeIndex.Empty);\n","sourceCodeStart":79,"sourceCodeEnd":115,"githubUrl":"https://github.com/stride3d/stride/blob/96fad776d210c221682aac1ccdf4c79dc046fc38/sources/presentation/Stride.Core.Quantum/MemberNode.cs#L79-L115","documentation":"MemberNode.UpdateFromMember propagates a changed container value into the member node. A member node represents a single property, so an item index makes no sense — only ItemNodes are indexed. Passing any NodeIndex other than NodeIndex.Empty indicates a caller is treating a member node like an indexed collection node, so ArgumentException is thrown.","triggerScenarios":"Calling ((IMemberNode)node).UpdateFromMember(newValue, someIndex) with an index built via NodeIndex.New(...), or forwarding an index obtained from an item-node change event to a member node's UpdateFromMember.","commonSituations":"Generic graph-update code that handles both item and member nodes with one path and passes the received index through; refactoring that changed a collection property into a plain property while update code still supplies indices.","solutions":["Pass NodeIndex.Empty when calling UpdateFromMember on a member node.","Branch on the node type: use UpdateFromMember(newIndex) only for item nodes, UpdateFromMember(NodeIndex.Empty) for member nodes.","Use the index-less MemberNode.Update(newValue) API instead when no index is involved."],"exampleFix":"// before\nmemberNode.UpdateFromMember(newValue, NodeIndex.New(3));\n// after\nmemberNode.UpdateFromMember(newValue, NodeIndex.Empty);","handlingStrategy":"type-guard","validationCode":"// C#\nif (node is IMemberNode && index != NodeIndex.Empty)\n    throw new ArgumentException(\"Member nodes require NodeIndex.Empty\", nameof(index));","typeGuard":"static bool CanUseIndex(IGraphNode node, NodeIndex index) => node is not IMemberNode || index == NodeIndex.Empty;","tryCatchPattern":"try { memberNode.UpdateFromMember(newValue, index); }\ncatch (ArgumentException ex) when (ex.ParamName == \"index\") { memberNode.UpdateFromMember(newValue, NodeIndex.Empty); }","preventionTips":["Branch on node type (IMemberNode vs item node) before choosing the update API","Only forward indices that came from item-node events to item-node APIs","Prefer MemberNode.Update(newValue) when no index is needed","Assert index == NodeIndex.Empty in member-node helper methods"],"tags":["argument-validation","graph-node","index","stride-quantum"],"backgroundTag":"invalid-argument-value","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"}