문제

저는 모든 익명 기능을 처음 사용하므로 도움이 필요합니다.나는 다음과 같은 작업을 수행했습니다.

public void FakeSaveWithMessage(Transaction t)
{
    t.Message = "I drink goats blood";
}

public delegate void FakeSave(Transaction t);

public void SampleTestFunction()
{
    Expect.Call(delegate { _dao.Save(t); }).Do(new FakeSave(FakeSaveWithMessage));
}

그러나 이것은 완전히 추한 일이며 가능하다면 Do 내부를 익명 메서드나 람다로 만들고 싶습니다.나는 시도했다:

Expect.Call(delegate { _dao.Save(t); }).Do(delegate(Transaction t2) { t2.Message = "I drink goats blood"; });

그리고

Expect.Call(delegate { _dao.Save(t); }).Do(delegate { t.Message = "I drink goats blood"; });

하지만 이것들은 나에게

대리자 유형** 컴파일 오류가 아니기 때문에 무명 메서드를 'System.Delegate' 유형으로 변환할 수 없습니다.

내가 도대체 ​​뭘 잘못하고있는 겁니까?


Mark Ingram이 게시한 내용으로 인해 아무도 명시적으로 언급하지 않았지만 가장 좋은 대답은 다음과 같습니다.

public delegate void FakeSave(Transaction t);

Expect.Call(delegate { _dao.Save(t); }).Do( new FakeSave(delegate(Transaction t2) { t.Message = expected_msg; }));
도움이 되었습니까?

해결책

이는 잘 알려진 오류 메시지입니다.자세한 논의는 아래 링크를 확인하세요.

http://staceyw1.wordpress.com/2007/12/22/they-are-anonymous-methods-not-anonymous-delegates/

기본적으로 익명 대리자(람다 식) 앞에 캐스트를 넣으면 됩니다.

링크가 다운될 경우를 대비해 게시물 사본은 다음과 같습니다.

그들은 익명 대의원이 아닌 익명의 방법입니다.
2007년 12월 22일 staceyw1에 의해 게시됨

우리가 어려워지기를 원하기 때문에 단지 이야기 요점이 아닙니다.정확히 무슨 일이 일어나고 있는지에 대한 추론에 도움이됩니다.분명히, 익명 대표와 같은 것은 없습니다.그들은 존재하지 않습니다 (아직은 아닙니다).그들은 "익명 방법" - 기간입니다.그것은 우리가 그것들을 어떻게 생각하는지와 우리가 그들에 대해 이야기하는 방법에 중요합니다.익명 메소드 문 "Delegate () {…}"을 살펴 보겠습니다.이것은 실제로 두 가지 다른 작업이며, 이런 식으로 생각할 때 다시는 혼란스러워지지 않을 것입니다.컴파일러가 가장 먼저하는 것은 추론 된 대리인 서명을 메소드 서명으로 사용하여 표지 아래에서 익명 메소드를 만드는 것입니다.이름이 있고 컴파일러가 할당하기 때문에 메소드가 "이름이 없다"고 말하는 것은 옳지 않습니다.그것은 정상적인 관점에서 숨겨져 있습니다.다음으로하는 일은 메소드를 래핑하기 위해 필요한 유형의 대의원 객체를 만드는 것입니다.이것을 대표 추론이라고 하며이 혼란의 원천이 될 수 있습니다.이것이 작동하려면 컴파일러가 파악할 수 있어야합니다 (예 :추론) 어떤 대표 유형이 생성 될 것인지.알려진 콘크리트 유형이어야합니다.이유를 확인하기 위해 코드를 작성하십시오.

private void MyMethod()
{
}

컴파일하지 않습니다:

1) Delegate d = delegate() { };                       // Cannot convert anonymous method to type ‘System.Delegate’ because it is not a delegate type
2) Delegate d2 = MyMethod;                         // Cannot convert method group ‘MyMethod’ to non-delegate type ‘System.Delegate’
3) Delegate d3 = (WaitCallback)MyMethod;   // No overload for ‘MyMethod’ matches delegate ‘System.Threading.WaitCallback’

컴파일러가 대의원 유형을 유추 할 수 없으므로 1 행 1은 컴파일하지 않습니다.우리가 원하는 서명을 분명히 볼 수 있지만 컴파일러가 볼 수있는 콘크리트 대의원 유형은 없습니다.익명의 유형의 유형 대의원을 만들 수 있지만 그렇게 작동하지 않습니다.2 행은 비슷한 이유로 컴파일하지 않습니다.컴파일러는 메소드 서명을 알고 있지만 대의원 유형을 제공하지 않으며 작동하는 일을 선택하는 것이 아닙니다 (어떤 부작용이 아닌).3 행 3은 다른 서명을 가진 대의원과 함께 메소드 서명을 의도적으로 일치하지 않기 때문에 작동하지 않습니다 (WaitCallback 테이크 및 객체).

컴파일:

4) Delegate d4 = (MethodInvoker)MyMethod;  // Works because we cast to a delegate type of the same signature.
5) Delegate d5 = (Action)delegate { };              // Works for same reason as d4.
6) Action d6 = MyMethod;                                // Delegate inference at work here. New Action delegate is created and assigned.

대조적으로, 이것들은 작동합니다.라인 1은 컴파일러에 사용할 위임 유형을 알려주고 일치하므로 작동하기 때문에 작동합니다.5 행은 같은 이유로 작동합니다.참고 우리는 Parens없이 특별한 형태의 "대표"를 사용했습니다.컴파일러는 캐스트에서 메소드 서명을 주행하고 유추 된 대의원 유형과 동일한 서명으로 익명 메소드를 만듭니다.6 행 6은 myMethod () 및 작업이 동일한 서명을 사용하기 때문에 작동합니다.

이게 도움이 되길 바란다.

다음도 참조하세요. http://msdn.microsoft.com/msdnmag/issues/04/05/C20/

다른 팁

마크가 말한 것.

문제는 Do가 Delegate 매개변수를 취한다는 것입니다.컴파일러는 익명 메서드를 Delegate로 변환할 수 없으며 "대리자 유형"만 변환할 수 있습니다.Delegate에서 파생된 구체적인 유형입니다.

해당 Do 함수가 Action<>, Action<,> ...을 취했다면 ...등.과부하가 발생하면 캐스트가 필요하지 않습니다.

문제는 대리자 정의에 있는 것이 아니라 Do() 메서드의 매개 변수가 System.Delegate 형식이고 컴파일러에서 생성된 대리자 형식(FakeSave)이 암시적으로 System.Delegate로 변환되지 않는다는 것입니다.

익명 대리인 앞에 캐스트를 추가해 보세요.

Expect.Call(delegate { _dao.Save(t); }).Do((Delegate)delegate { t.Message = "I drink goats blood"; });

다음과 같이 시도해 보세요:

Expect.Call(delegate { _dao.Save(t); }).Do(new EventHandler(delegate(Transaction t2) { t2.CheckInInfo.CheckInMessage = "I drink goats blood"; }));

대리자 주위에 추가된 EventHandler를 확인하세요.

편집하다:EventHandler와 대리자의 함수 서명이 동일하지 않기 때문에 작동하지 않을 수 있습니다.질문 하단에 추가한 솔루션이 유일한 방법일 수 있습니다.

또는 일반 대리자 유형을 만들 수 있습니다.

public delegate void UnitTestingDelegate<T>(T thing);

따라서 대리인은 특정 거래가 아닙니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top