{"record":{"id":"a9d24468cae3b269","repo":"dotnet/wpf","slug":"sr-enumerator-notstarted-transformcollection","errorCode":null,"errorMessage":"SR.Enumerator_NotStarted","messagePattern":"SR\\.Enumerator_NotStarted","errorType":"exception","errorClass":"InvalidOperationException","httpStatus":null,"severity":"error","filePath":"src/Microsoft.DotNet.Wpf/src/PresentationCore/System/Windows/Media/Generated/TransformCollection.cs","lineNumber":884,"sourceCode":"            /// <summary>\n            /// Current element\n            ///\n            /// The behavior of IEnumerable&lt;T>.Current is undefined\n            /// before the first MoveNext and after we have walked\n            /// off the end of the list. However, the IEnumerable.Current\n            /// contract requires that we throw exceptions\n            /// </summary>\n            public Transform Current\n            {\n                get\n                {\n                    if (_index > -1)\n                    {\n                        return _current;\n                    }\n                    else if (_index == -1)\n                    {\n                        throw new InvalidOperationException(SR.Enumerator_NotStarted);\n                    }\n                    else\n                    {\n                        Debug.Assert(_index == -2, \"expected -2, got \" + _index + \"\\n\");\n                        throw new InvalidOperationException(SR.Enumerator_ReachedEnd);\n                    }\n                }\n            }\n\n            #endregion\n\n            #region Data\n            private Transform _current;\n            private TransformCollection _list;\n            private uint _version;\n            private int _index;\n            #endregion\n        }","sourceCodeStart":866,"sourceCodeEnd":902,"githubUrl":"https://github.com/dotnet/wpf/blob/81131a70a4c573cd62748a5c36908fc4d662daa9/src/Microsoft.DotNet.Wpf/src/PresentationCore/System/Windows/Media/Generated/TransformCollection.cs#L866-L902","documentation":"TransformCollection.Enumerator.Current throws InvalidOperationException with Enumerator_NotStarted when accessed before the first MoveNext() call. The enumerator's _index is still -1 (positioned before the first element), so there is no valid current item to return.","triggerScenarios":"Accessing the Current property immediately after GetEnumerator() without calling MoveNext() first; e.g. `var e = collection.GetEnumerator(); var t = e.Current;`.","commonSituations":"Hand-written enumerator loops that forget the initial MoveNext(); code ported from COM-style iteration; LINQ-free manual enumeration where Current is read inside a condition evaluated before MoveNext.","solutions":["Always call MoveNext() (and check its true return value) before reading Current.","Prefer foreach, which manages MoveNext/Current ordering automatically.","If manual enumeration is required, initialize with `if (e.MoveNext()) { use e.Current; }`.","Catch InvalidOperationException only as a last-resort guard around Current access."],"exampleFix":"// before\nvar e = transformCollection.GetEnumerator();\nvar first = e.Current; // throws: not started\n// after\nvar e = transformCollection.GetEnumerator();\nif (e.MoveNext())\n{\n    var first = e.Current;\n}","handlingStrategy":"validation","validationCode":"if (transformCollection.Count > 0 && enumerator.MoveNext())\n{\n    var current = enumerator.Current; // safe\n}","typeGuard":"static bool TryGetCurrent(TransformCollection c, out Transform current)\n{\n    using var e = c.GetEnumerator();\n    if (e.MoveNext()) { current = e.Current; return true; }\n    current = null; return false;\n}","tryCatchPattern":"try\n{\n    var cur = enumerator.Current;\n}\ncatch (InvalidOperationException)\n{\n    // MoveNext() was never called or enumeration ended; call MoveNext() first\n}","preventionTips":["Always pair Current with a prior successful MoveNext().","Prefer foreach which enforces MoveNext-before-Current ordering.","Empty-check Count > 0 before starting manual enumeration."],"tags":["wpf","enumerator","invalidoperationexception","ienumerable"],"backgroundTag":"invalid-state-transition","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"}