瀏覽代碼

Current has undefined behavior when MoveNextAsync returns false or throws.

Bart De Smet 7 年之前
父節點
當前提交
61d300dd98

+ 0 - 6
Ix.NET/Source/System.Interactive.Async.Tests/System/Linq/Operators/IgnoreElements.cs

@@ -25,8 +25,6 @@ namespace Tests
 
             var e = xs.GetAsyncEnumerator();
             NoNext(e);
-
-            AssertThrows<InvalidOperationException>(() => { var ignored = e.Current; });
         }
 
         [Fact]
@@ -36,8 +34,6 @@ namespace Tests
 
             var e = xs.GetAsyncEnumerator();
             NoNext(e);
-
-            AssertThrows<InvalidOperationException>(() => { var ignored = e.Current; });
         }
 
         [Fact]
@@ -47,8 +43,6 @@ namespace Tests
 
             var e = xs.GetAsyncEnumerator();
             NoNext(e);
-
-            AssertThrows<InvalidOperationException>(() => { var ignored = e.Current; });
         }
 
         [Fact]

+ 0 - 1
Ix.NET/Source/System.Interactive.Async.Tests/System/Linq/Operators/Never.cs

@@ -18,7 +18,6 @@ namespace Tests
 
             var e = xs.GetAsyncEnumerator();
             Assert.False(e.MoveNextAsync().IsCompleted); // Very rudimentary check
-            AssertThrows<InvalidOperationException>(() => Nop(e.Current));
             await e.DisposeAsync();
         }
 

+ 0 - 1
Ix.NET/Source/System.Linq.Async.Tests/System/Linq/Operators/Throw.cs

@@ -24,7 +24,6 @@ namespace Tests
 
             var e = xs.GetAsyncEnumerator();
             AssertThrows(() => e.MoveNextAsync().Wait(WaitTimeoutMs), (Exception ex_) => ((AggregateException)ex_).InnerExceptions.Single() == ex);
-            AssertThrows<InvalidOperationException>(() => Nop(e.Current));
         }
 
         private void Nop(object o)

+ 2 - 18
Ix.NET/Source/System.Linq.Async/System/Linq/AsyncIterator.cs

@@ -12,8 +12,6 @@ namespace System.Linq
     {
         private readonly int _threadId;
 
-        private bool _currentIsInvalid = true;
-
         internal TSource current;
         internal AsyncIteratorState state = AsyncIteratorState.New;
         internal CancellationToken cancellationToken;
@@ -43,16 +41,7 @@ namespace System.Linq
             return TaskExt.CompletedTask;
         }
 
-        public TSource Current
-        {
-            get
-            {
-                if (_currentIsInvalid)
-                    throw new InvalidOperationException("Enumerator is in an invalid state");
-
-                return current;
-            }
-        }
+        public TSource Current => current;
 
         public async ValueTask<bool> MoveNextAsync()
         {
@@ -67,15 +56,10 @@ namespace System.Linq
 
             try
             {
-                var result = await MoveNextCore(cancellationToken).ConfigureAwait(false);
-
-                _currentIsInvalid = !result; // if move next is false, invalid otherwise valid
-
-                return result;
+                return await MoveNextCore(cancellationToken).ConfigureAwait(false);
             }
             catch
             {
-                _currentIsInvalid = true;
                 await DisposeAsync().ConfigureAwait(false);
                 throw;
             }