2017-10-23 4 views
0
protected IteratorAdvance<int> Advance; 

public delegate void IteratorAdvance<T2>(out T2 itemIndex); 

public IteratorBase() 
{ 
    Advance = delegate(out int i) { i++; }; // <--- here 
} 

위의 예제는 여러 유형의 루프에 대한 래퍼 인 클래스의 조각입니다. 아래의 생성자 오버로드에서 인스턴스 생성자는 for 루프를 계속 수행 할 조건을 결정하는 방법과 각 반복에서 해당 루프의 제어 값을 수정하는 방법을 지정할 수 있습니다.위임 액션의 out 매개 변수에 대한 기본값 설정

분명히 가장 간단한 방법은 0에서 시작하여 데이터 소스의 마지막 인덱스에 도달 할 때까지 1 씩 증가시키는 것입니다. 이를 위해 나는 생성자를 기본 방법과 효율적이다 (그리고이 경우에 매우 복잡한 버전) 여기

for(var i = 0; i < list.Count; i++) 

초기 값을 있어요 제공 한 :

public IteratorBase(IterationStyle style, Func<int, T1, bool> complete, IteratorAdvance<int> advance, bool onErrorAbort = true, int initialValue = 0) 
{ 
    Style = style; 
    InitialValue = initialValue; 
    Complete = complete; 
    Advance = advance; 
    AbortOnError = onErrorAbort; 
} 

이 문제는 어디 I 컨트롤 값을 증가 시키면 컴파일러는 해당 범위에서 선언 된 변수 (i)에 대한 기본값을 원하며 out 매개 변수이기 때문에 기본값을 받아 들일 수 없습니다.

함수 본문을 별도의 메서드로 옮기더라도 같은 문제가 있습니다. out 루프를 초기화하기 전에 out 매개 변수를 초기화 할 수 없습니다. 내가 생각할 수있는

case IterationStyle.For: 
    for (controlValue = InitialValue; !Complete(controlValue, item); Advance(out controlValue)) 
    { 
     action.TargetItem = item = dataSource[controlValue]; 
     if (!ActWrapper(action)) 
      return false; 
    } 
    break; 

유일한 솔루션은 방법 외부 부울의 어떤 종류를 사용하여 포함하는 메소드의 최초의 호출에 out 매개 변수를 intialise하는 것입니다. 나는 그런 종류의 일을 피하기 위해 내가 혼자 있다고 생각하지 않는다. 그리고 그것은 어느 쪽이든 작동하지 않는 것으로 밝혀 지므로 나는 통제 값을 전역 적으로 만들어야 할 것입니다. 내 시체 이상.

일반적으로 이러한 상황에서는 사용자의 접근 방식이 잘못되었다는 것을 의미합니다. 하지만 나는 다른 생각을 할 수 없다. 나는 네가 할 수 있기를 바라고있다. 또는 out 매개 변수를 초기화하거나 기본값을 부여하는 방법을 알려주십시오.

+0

아니요, 도움이되지 않았습니다. 대답은 간단합니다. 나는 ref를 사용하지 말아야한다. D' oh! – twelveFunKeys

+0

아, 심판 예. 나는 그것을 제안 할 예정였다 :) – David

답변

2

다른 사람들이 나쁜 두뇌의 날을 보내고있는 경우를 대비하여 다음과 같은 해결책을 제시합니다. ref이 아닌 out을 사용하십시오.

Advance = delegate(ref int i) { i++; };