2010-03-17 2 views

답변

70

그것은 Func 수행 할 수 없지만 당신이에 대한 사용자 지정 delegate를 정의 할 수 있습니다 : 당신은 또한 ref 유형이 방법을 지원할 수 4+ .NET에서

public object MethodWithRefFloat(ref float y) 
{ 
    return null; 
} 

public void MethodCallThroughDelegate() 
{ 
    MethodNameDelegate myDelegate = MethodWithRefFloat; 

    float y = 0; 
    myDelegate(ref y); 
} 
+23

이유 : 모든 제네릭 유형 인수는 전환 가능한 항목이어야합니다. 물체를 거부 할 수 있습니다. "ref float"는 객체로 변환 할 수 없으므로 일반 유형 인수로 사용할 수 없습니다. –

+1

그 점에 대해 고마워 Func을 사용하는 데 어려움을 겪었으므로 유형이 객체로 변환 될 수없는 이유는 무엇입니까? – chugh97

+0

이 경우 대리자 입력에 boxing/unboxing이 필요합니까? –

5

:

public delegate object MethodNameDelegate(ref float y); 

사용 예를 ...

public delegate bool MyFuncExtension<in string, MyRefType, out Boolean>(string input, ref MyRefType refType); 
+1

죽은 스레드를 부활시키지는 못하지만이 방법으로 제네릭을 사용하여 ref 매개 변수를 지원할 수있는 반면 generic 형식 매개 변수는 불변 할 것입니다. 일반 형식 매개 변수는 C#의 ref 또는 out 매개 변수에 대한 분산 (공분산 또는 반항)을 지원하지 않습니다. 그래도 암시적인 타입 변환에 대해 걱정할 필요가 없다면 괜찮습니다. –

+2

죄송합니다.이 답변은 약간 벗어났습니다. 델리게이트를 paramerizing하기 위해 보여주는'in'과'out'은 co-versus "contra-variance"와 관련이 있으며 OP가 요구하는 것과는 관련이 없습니다. 질문은 형식 매개 변수화와 관련하여 (일반) 대리자의 민첩성이 아니라 참조로 매개 변수를 수락 할 수있는 대리자에 대한 것입니다. –

관련 문제