2010-04-29 3 views
1

나는 그것을 네임드 타입으로 형변환하면 내가 원하는대로 할 수 있지만, 메소드 호출간에 익명 성을 유지할 수 있다면 훨씬 더 세밀한 코드를 만들 수 있다는 것을 이해한다.익명 형식을 만든 메서드 외부에서 사용할 수없는 이유는 무엇입니까?

+0

중복 ((http://stackoverflow.com/questions/2450536/simple-way-to-return-anonymous-types-to-make- mvc-linq-possible)). @DaveDev : [여기] (https://connect.microsoft.com/VisualStudio/feedback/details/542278/ability-to-return-strongly-typed-anonymous-classes)도 참조하십시오. –

+1

제목을 기준으로 중복 - 귀하의 질문은 그것이 일어날 수있는 방법을 모색합니다. 내 질문은 이유를 묻습니다. – DaveDev

+0

질문은 거짓을 전제로하므로 대답 할 수 없습니다. 익명 형식은 어셈블리 내에서 통합됩니다. 동일한 어셈블리에서 두 개의 다른 메서드에서 동일한 익명 형식을 사용하면 동일한 형식을 사용하게됩니다. –

답변

1

메소드의 서명을 계약으로 생각하십시오. 귀하의 방법은 "다음 필드가 포함 된 것을 반환하겠다고 약속합니다."라고 말합니다. 메서드에서 익명 개체를 반환하는 경우 계약이 없습니다. 너는 단지 말하고있다 "여기에 데이터가있다. 행운을 빈다."

C# 4가 모두 옵션 인 경우 다소 더 많은 임의의 데이터를 반환하려면 tuples을 사용하면됩니다.

+0

내가 벤에게 준 동일한 대답 : 컴파일러가 배후에서 클래스를 생성하고 나중에 모든 기존 유형 검증을 사용할 수있다. –

+0

@BlueRaja The Green Unicorn : 컴파일러가 그림을 그릴 수있다. (예를 들어) F # 컴파일러는 코드에서 유형을 파악할 수 있습니다 (또는 유형 오류가 발생 함). C# 컴파일러 (지금 현재)가 그렇게하지 않는다는 사실을 변경하지 않습니다. – R0MANARMY

1

매우 깨끗하지 않으므로 피해야하지만, Jon Skeet의 해킹은 this입니다. 그러나 가능하다면 피해야합니다.

+0

예제로 좋은 오래된 캐스트. – R0MANARMY

+0

그건 그냥 심술 궂네! –

-2

이 추측입니다 ...하지만 난 내가 맞다 "확인"해요 그래서 "최고"난 ...

익명 형식 정말 "익명."하지 알 수없는 유형을 나타내는 클래스는 런타임시 런타임 스택에서 메서드 호출에 로컬로 생성됩니다 (따라서 메서드 전용 범위). 함수 호출 (스택을 팝하는 중)을 반환하면 해당 메서드 호출로 스택에 숨어 있던 익명 클래스를 포함하여 해당 범위에있는 모든 객체가 손실됩니다. 이상 추측

... [내 질문] 중 하나의

+1

익명 형식은 컴파일 타임에 생성됩니다.차이점은 생성 된 범위에 대해 비공개임을 의미합니다. –

+0

익명 클래스는 컴파일 타임에 생성됩니다. http://tomasp.net/blog/cannot-return-anonymous-type-from-method.aspx 이것이 바로 John Rasch의 "예제 캐스트"예제가 작동하는 이유입니다. – R0MANARMY

+2

죄송합니다. 귀하의 추측은 잘못되었습니다. 익명 유형은 컴파일시 생성됩니다. Reflector를 사용하여이를 확인할 수 있습니다. 또한 익명 형식 인스턴스를'object'로 전달하고 리플렉션을 사용하여 재생할 수 있지만 프로덕션 코드에서는 사용하지 않는 것이 좋습니다. – LukeH