2010-08-12 10 views
17

저는 C#에 익숙하지 않아서 제 질문은 간단하지만 여기에 있습니다.캐스팅 대리인

저는 대리인과 협력하려고 노력해 왔으며,이 문제에 다소 방해가됩니다.

..... 
    public delegate double delegateA(); 
    public delegate double delegateB(); 

    public static double myFunc() 
    { 
     return 0; 
    } 
    public static delegateA myTest() 
    { 
     return myFunc; 
    } 

    static void Main(string[] args) 
    { 
     delegateB myFuncDelegate; 

     myFuncDelegate = myTest(); // <-- Error: Cannot implicitly convert type.... 
    } 
..... 

형식과 동일한 대리인을 사용하지 않는 한이 변환 작업을 수행하는 방법을 모르겠습니다. 서로 다른 클래스에 존재하는 하지만 내 프로젝트에, 대리인의 다른 이름을 가지고 더 귀여운 것 (.

당신이 날 도울 수 있기를 바랍니다.

+0

사용중인 C# 버전은 무엇입니까? 현대적인 코드 변형은'Func '입니다. – Kobi

답변

21

당신이 직접처럼 대표 사이에 변환 할 수 없습니다 . 당신이 입니다 기존 호환 하나에서 새로운 위임을 수행 할 수있는 당신이 코드를 변경 그래서 만약 :..

delegateB myFuncDelegate = new delegateB(myTest()); 

일 것이다 ("호환성"필요하지 않습니다 서명자가 es는 동일합니다. 자세한 내용은 언어 사양을 참조하십시오.)

다른 독자에게는 약간 더 명확하게하기 위해 여기에 메서드 호출이 필요없는 간단한 예제가 있습니다.

이 "아니오 전환 '규칙에 한 가지 예외가 있다는
// Two delegate types with the same signature 
delegate void Foo(); 
delegate void Bar(); 

class Test 
{ 
    static void Main() 
    { 
     // Actual value is irrelevant here 
     Foo foo = null; 

     // Error: can't convert like this 
     // Bar bar = foo; 

     // This works fine 
     Bar bar = new Bar(foo); 
    } 
} 

주 - 예를 들어 C#을 4의 일반적인 분산이 C# 4 당신 쓰기에, : Action<T> 때문에 ...

Action<object> foo = x => Console.WriteLine(x.GetHashCode()); 
Action<string> bar = foo; 

반작용T입니다. 따라서 실제로는 Action<in T>으로 선언됩니다. 참조 변환 - 첫 번째 샘플처럼 대리자를 만들지 않습니다. 그러나 이것은 단지 "호환"대리자 - 일반적인 것만 사용할 수는 없습니다. 또한

+0

그게 효과가!. :-) 도움 주셔서 감사합니다. – JakobJ

+1

이렇게하면 대상이 첫 번째 대리자의 Invoke 메서드인데, 사용자가 원하지 않는 간접 수준입니다. 원래 대상을 직접 참조하는 새 대리자를 얻는 방법은 http://stackoverflow.com/a/9290684/497397 및 주변 토론을 참조하십시오. –

5

, 당신은에 대해 질문하지 정확히하지만, 흥미롭게도 -이 작동하지 않습니다

Func<double> func_double =() => 1; 
Func<object> func_object; 

func_object = func_double; 

을하지만이 작업을 수행합니다

Func<string> func_string =() => "hello"; 
Func<object> func_object; 

func_object = func_string; 

차이가 참조 형식을 사용하는 문자열 예 인 객체에 캐스트 할 수있는 반면 double은 boxed되어야하므로 직접 캐스트가 차단됩니다.