private void BoundsCheck(SequencePosition start, SequencePosition position) { int startIndex = start.Index; int endIndex = position.Index; SequenceType type = GetSequenceType(); startIndex = GetIndex(startIndex); endIndex = GetIndex(endIndex); switch (type) { case SequenceType.OwnedMemory: case SequenceType.Array: if (endIndex > startIndex) { ThrowHelper.ThrowArgumentOutOfRangeException_PositionOutOfRange(); } return; case SequenceType.MemoryList: IMemoryList <T> segment = (IMemoryList <T>)position.Segment; IMemoryList <T> memoryList = (IMemoryList <T>)start.Segment; if (segment.RunningIndex - startIndex > memoryList.RunningIndex - endIndex) { ThrowHelper.ThrowArgumentOutOfRangeException_PositionOutOfRange(); } return; default: ThrowHelper.ThrowInvalidOperationException_UnexpectedSegmentType(); return; } }