{"record":{"id":"41bb8f32ea6013d0","repo":"egametang/ET","slug":"invalidoperation-enumopcanthappen","errorCode":null,"errorMessage":"InvalidOperation_EnumOpCantHappen","messagePattern":"InvalidOperation_EnumOpCantHappen","errorType":"exception","errorClass":"InvalidOperationException","httpStatus":null,"severity":"error","filePath":"Packages/cn.etetet.core/Scripts/Core/Share/Collection/SortedSet.cs","lineNumber":2115,"sourceCode":"            public T Current\n            {\n                get\n                {\n                    if (_current != null)\n                    {\n                        return _current.Item;\n                    }\n                    return default(T)!; // Should only happen when accessing Current is undefined behavior\n                }\n            }\n\n            object IEnumerator.Current\n            {\n                get\n                {\n                    if (_current == null)\n                    {\n                        throw new InvalidOperationException(SR.InvalidOperation_EnumOpCantHappen);\n                    }\n\n                    return _current.Item;\n                }\n            }\n\n            internal bool NotStartedOrEnded => _current == null;\n\n            internal void Reset()\n            {\n                if (_version != _tree.version)\n                {\n                    throw new InvalidOperationException(SR.InvalidOperation_EnumFailedVersion);\n                }\n                _stack.Clear();\n                Initialize();\n            }\n","sourceCodeStart":2097,"sourceCodeEnd":2133,"githubUrl":"https://github.com/egametang/ET/blob/5cab01f7a8bee5f49f4781eebe9e2b1c6d7ebe0f/Packages/cn.etetet.core/Scripts/Core/Share/Collection/SortedSet.cs#L2097-L2133","documentation":"Thrown by the non-generic IEnumerator.Current getter when _current is null, i.e. the enumerator has not started (MoveNext never called) or has already finished. Accessing Current outside a valid MoveNext-true window is undefined, so the library rejects it. Surfaces as InvalidOperationException (InvalidOperation_EnumOpCantHappen).","triggerScenarios":"Reading IEnumerator.Current before the first MoveNext; reading Current after MoveNext returned false; calling Reset then Current without MoveNext again.","commonSituations":"Manual enumerator driving (while (e.MoveNext()) ... e.Current) with a logic bug; using the non-generic IEnumerator via LINQ/Reflection that touches Current eagerly; copy-paste of enumerator loops missing the MoveNext guard.","solutions":["Always guard Current with a successful MoveNext: if (e.MoveNext()) x = e.Current;","Prefer the generic GetEnumerator()/foreach pattern, which never reads Current prematurely.","Check NotStartedOrEnded (_current == null) before accessing Current in manual code."],"exampleFix":"// before\nvar e = set.GetEnumerator();\nvar first = e.Current; // throws\n\n// after\nvar e = set.GetEnumerator();\nobject first = e.MoveNext() ? e.Current : null;","handlingStrategy":"validation","validationCode":"// Guard Current with a successful MoveNext.\nvar e = set.GetEnumerator();\nT first = e.MoveNext() ? e.Current : default;","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Prefer foreach over manual MoveNext/Current loops.","Check NotStartedOrEnded before reading Current in manual code.","Never read Current after MoveNext returns false."],"tags":["sortedset","enumeration","enumerator","collection","csharp"],"backgroundTag":null,"analyzedSha":"5cab01f7a8bee5f49f4781eebe9e2b1c6d7ebe0f","analyzedAt":"2026-08-13T21:10:40.377Z","schemaVersion":2},"datasetVersion":"2026-08-14T00:17:13.853Z"}