매개 변수가없는 Func <T>


167

Outc 매개 변수가있는 메소드를 Func으로 전달할 수 있습니까?

public IList<Foo> FindForBar(string bar, out int count) { }

// somewhere else
public IList<T> Find(Func<string, int, List<T>> listFunction) { }

Func는 형식이 필요하므로 컴파일 할 수 없으며 listFunction을 호출하면 int가 필요하고 out을 허용하지 않습니다.

이 방법이 있습니까?

답변:


228

refout형식 매개 변수 정의의 일부는 내장 사용할 수없는 Func통과 위임 refout인수. 물론 원하는 경우 자신의 대리인을 선언 할 수 있습니다.

delegate V MyDelegate<T,U,V>(T input, out U output);

7
C # 4 (2010) 이상 (응답을 작성할 때 릴리스되지 않음)에서는 T반 변량 및 V공변량 으로 표시 할 수 있습니다 . 그러나, 사람 파라미터 ( output)의 형식이 U전달 참고로 , U코 또는 contravariant 표시 할 수없고, "불변"을 유지한다. 따라서 public delegate V MyDelegate<in T, U, out V>(T input, out U output);C # 4 이상을 사용하는지 고려 하십시오.
Jeppe Stig Nielsen


24

결과를 캡슐화하는 클래스를 작성하지 않겠습니까?

public class Result
{
     public IList<Foo> List { get; set; }
     public Int32 Count { get; set; }
}

13

Func대표 (또는 가족은 Action그 문제에 대해) 아무것도하지만, 같은 선언 간단한 위임 유형 없습니다

//.NET 4 and above
public delegate TResult Func<out TResult>()
public delegate TResult Func<in T, out TResult>(T obj)

//.NET 3.5
public delegate TResult Func<T1, T2, TResult>(T1 obj1, T2 obj2)
public delegate TResult Func<T1, T2, T3, TResult>(T1 obj1, T2 obj2, T3 obj3)

등. 대리인은 out / ref 매개 변수를 가질 수 있으므로 귀하의 경우 다른 답변에서 지적한 것처럼 사용자 정의 구현 문제만이 가능합니다. Microsoft가 기본적으로 이것을 포장하지 않은 이유에 대해서는 필요한 조합의 수를 생각하십시오.

delegate TResult Func<T1, T2, TResult>(T1 obj1, T2 obj2)
delegate TResult Func<T1, T2, TResult>(out T1 obj1, T2 obj2)
delegate TResult Func<T1, T2, TResult>(T1 obj1, out T2 obj2)
delegate TResult Func<T1, T2, TResult>(out T1 obj1, out T2 obj2)

두 개의 매개 변수 만 있습니다. 우리는 만지지 않았습니다 ref. 실제로 개발자에게는 번거롭고 혼란 스러울 수 있습니다.


2
C # 함수를 오버로드는 구별 할 수 없습니다 delegate TResult Func<T1, T2, TResult>(T1 obj, T2 obj)delegate TResult Func<T1, T2, TResult>(out T1 obj, T2 obj). 따라서 오버로드 수 심볼 이름 외에 Microsoft가 이러한 오버로드를 추가 할 수없는 또 다른 이유가 Func있습니다.
카스퍼 반 덴 버그

누군가 위의 대리인에 대한 MSDN 기사를 참조 할 수 있습니까?
Su Llewellyn

@SuLlewellyn 원본 msdn 기사를 찾을 수 없었지만 다음과 같이 시도해보십시오. docs.microsoft.com/en-us/dotnet/api/… , docs.microsoft.com/en-us/dotnet/api/…
nawfal

0

올바른 인터페이스를 노출하고 FindForBar를 호출 한 람다 / 대리인 / 함수 / 방법으로 래핑 할 수 있지만 FindForBar가 원인으로 out 매개 변수로 계산 된 것으로 의심되므로 정보를 버리는 것이 확실해야합니다. ok / safe / desirable / 올바른 결과를 얻었습니다 (FindForBar에 직접 전달할 수있는 경우에도이를 확인해야 함).

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.