2012-10-15 4 views
0

나는 다음과 같은 문제가일반 위임 구현

를 해결하기 위해 노력하고 void 형을 반환 가지고 인수로 T 값을 취 제네릭 대리자 형식 조치를 선언합니다. 이것은 어제의 대표 유형 IntAction의 일반화입니다. 이 방법은 어레이 도착의 모든 요소에 위임 법을 적용한다

static void Perform<T>(Action<T> act, params T[] arr) { ... }

방법을 갖는 클래스를 선언 . Perform<T> 메서드를 구현할 때는 foreach 문을 사용하십시오.

내 코드는 지금까지 다음과 같습니다 : 그것은 제대로 작동하지 않습니다와 나는이 부분을 잃었다

namespace CSharpexercices 
{ 
    public delegate void Action<T>(T value); 

    public class GenericDelegate 
    { 
     static void Perform<T>(Action<T> act, params T[] arr) 
     { 
      foreach (T i in arr) 
      { 
       act(arr[i]); 
      } 
     } 
    } 
} 

"이 어제의 대리자 형식의 IntAction의 일반화

는 사람이 꽤 나를 도울 수 없습니다. 당신이 변경된 경우는 어떻게

+0

'수행'을 호출하는 데 사용하는 코드로 질문을 편집 할 수 있습니까? –

답변

1

IntAction 대리자 유형 (C의 함수 포인터 ++과 같은 방법에 관한 기준을 나타내는 유형)이다. 다음과 같이

는 대부분의 경우 강사는 선언 :

public delegate void IntAction(int input); 

을하고, 따라서 그것은 int에 소요 void를 반환하는 방법을 나타냅니다. 이것을 일반화하기 위해, 당신의 숙제는 그러한 대의원을 일반화 할 것을 요구합니다. ANY TYPE의 객체를 취하고, T 타입이라고하고, void를 반환하는 메소드를 생성하기를 원합니다.그게 실제로 대의원 System.Action 당신이 사용하는 것처럼하지만 당신이 숙제라고 생각하는 그 델리게이트 형식을 선언하라. 당신의 foreach 루프에서 실수가

public delegate void GenericAction<T>(T input); 

: 이것은 당신이 (필자는 위임 GenericAction에게 전화를 정확하게 같은 방법으로 그것을 사용하는 것이 당신이 액션을 사용하여) 그것을 할 방법이다. 대리자를 적용한 결과를 배열의 요소에 할당하려고합니다. 하지만 대표단 액션은 무효로 돌아갑니다!

는 질문을 수정하거나 더 많은 설명이 필요한 경우 의견을 자유롭게

act (i); //you can't use the result of applying act to i (because it's void) so just leave it. 

이 변화

arr [i] = act (arr[i]); 

를 해결하려면.

+0

나는이 MZN에 대해 학교에 가지 않을거야, 나는 어떤 식 으로든 속이지 않고, 내가 붙어서 이해하려고 노력하고있다. –

+0

어쨌든 그것은 가정 일처럼 보입니다. 미안, 농담 이었어. 이 대답은 도움이됩니까? – Mzn

+0

:) 그 exercice 시트를 온라인으로 찾았습니다, 미안하지 마시고 도움을 주셔서 감사합니다 : P –

1

:)하십시오

arr[i] = act(arr[i]); 

act(arr[i]); 

할 수 있도록 지정 할 리턴 값이 없다, 그 act 반환 void을 기억하십시오.

어제의 대표 유형 인 IntAction을 일반화 한 것입니다.

이것은 아마도 Action<T> act이 아닌 Action<int> act을 호출하는 유사한 방법입니다.

편집 : 물론 arr를 통해 반복해야합니다 : 당신이

arr[i] = act(arr[i]); 

둘째 유사한 아무것도 할 수

for (T obj in arr) 
{ 
    act(obj); 
} 
+0

당신의 편집 내용이 @FurganSafdar의 의미라고 생각하지 않습니다. 특히, 'foreach'는 루프에서'.Count()'사용을 피하기 때문에'for'보다 * much * 더 좋습니다. –

+0

@ JamesD'Angelo 다른 편집을 할 것입니다. 편집은 처음에는 질문에서 틀린 'foreach' 루프를 덮지 않았다는 사실에 대한 응답이었습니다. –

+0

걱정할 필요가 없습니다. 좋은 수정! –

2

조치 당신은 INT를 반복 할 수없는, 어떤 반환 형식이 없습니다 foreach의 데이터 유형.

EDITED

public delegate void Action<T>(T value); 

public class GenericDelegate 
{ 
    static void Perform<T>(Action<T> act, params T[] arr) 
    { 
     foreach (T obj in arr) 
     { 
      act(obj); 
     } 
    } 
} 
+1

또는'foreach (T obj in arr) {act (obj); }' – Tanzelax

+0

그럴 수도 있습니다. –

+1

'for' 루프에서'.Count()'를 사용하지 마십시오. 자세한 내용은 [이 문서] (http://blogs.msdn.com/b/abhinaba/archive/2008/05/18/8517197.aspx)를 참조하십시오. –