2009-09-20 2 views

답변

16

당신이 쓸 수, 예를

 Action<int> method = j => j++; 
     List<Action<int>> operations = new List<Action<int>>(); 

     operations.Add(method); 
     operations.Add(i => i++); 
+0

,이 질문에 대한 답변에 정의 된 위임 한 번 봐 가지고하려고 : http://stackoverflow.com/questions/1184329/function-pointers -in-c –

0

그것은 같은 특정 대리자 형식의 목록을 만들 확실히 가능성에 대해 : 여기에 코드를 내가 쓰고 싶지만이 컴파일되지 않습니다이다 액션 또는 Func 또는 기타 익명의 대리자는 호환 가능한 서명이있는 모든 대리자 형식으로 캐스팅 할 수 있으므로 호환 가능한 서명이있는 한 대리자 목록을 만들 수 있습니다.

여러 종류의 서명이있는 대리인 목록을 만드는 것이 유용하지 않을 수 있습니다. 지정되지 않은 서명을 사용하면 대리인을 호출하기가 매우 어려워 질 것이기 때문입니다. 그래도 반성으로 그렇게 할 수 있어야합니다. 이 경우 객체 목록 만 사용할 수 있습니다.

3

코드에 문제가있어서 인스턴스를 List에 대한 형식 인수로 지정하려고합니다.

Action<int> method이 인스턴스 인 반면, Action<int>은 유형입니다.

다른 포스터에서 언급 한 것처럼 유형 목록을 유형 매개 변수로만 Action<int>으로 선언하면됩니다.

특정 위임보다 좀 더 유연한 뭔가를해야 할 경우

var myNum = 5; 

var myops = new List<Action<int>>(); 
myops.Add(j => j++); 
myops.Add(j => j++); 

foreach(var method in myops) 
{ 
    Console.WriteLine(method(myNum)); 
} 

// Frowned upon, but fun syntax 

myops.Each(method => method(myNum)); 
+0

왜 눈살을 찌푸 리지 않습니까? – recursive

+0

일부 사람들은 이러한 종류의 목록 내포를 부작용이있는 작업과 함께 사용하지 않아야한다고 생각합니다. 이와 같은 각 방법에는 본질적으로 부작용이 있습니다. – Joren

+0

@Joren : LINQ 표현식 (이해력 표현식 포함)은 부작용만으로는 게으른 특성 때문에 문제가 있습니다. 그러나 익명 메서드 및 람다 식은 LINQ에 대한 것만이 아니며 일반적으로 순수하게 작동하도록 제한 할 이유가 없습니다. 그래서, IMO,'List .Each()'와 함께 람다를 사용하는 것이 좋은 접근법입니다. – Richard

관련 문제