2011-01-27 7 views
0

VS2008에서 프로젝트를 빌드 할 때 정말 이상한 문제가 있습니다. 완전히 관련없는 변경 사항을 적용한 결과 빌드 오류가 발생하기 시작했습니다. 기본적으로 컴파일러는 잘못된 확장 메서드를 선택합니다.C# VS2008 컴파일러가 잘못 선택되었습니다.


Assembly1 : 참조 Assembly4.

[DebuggerHidden] 
public static List<T> ToList<T>(this IEnumerable<T> source) 
{} 

[System.Runtime.InteropServices.ComVisible(false), CLSCompliant(false)] 
public static List<T> ToList<T>(this IConcreteCollection collection) 
{} 

Assembly3

: 만 Assembly1를 참조합니다. CustomClass는 IConcreteCollection을 구현하지 않습니다.

List<CustomClass> list = new CustomClass[].ToList(); 

Assembly4 : IConcreteCollection를 정의했다.


오류 메시지 :

유형 'Assembly4.Namespace.IConcreteCollection는' 는 참조되지 않은 어셈블리에 정의되어 있습니다. 어셈블리 'Assembly4.Namespace, Version = ...'에 참조를 추가해야합니다. 당신이 볼 수 있듯이


는 Assembly3 잘못 유형이 일치하지 않는다는 사실에도 불구하고, Assembly1에서 잘못된 확장을 사용하려고했다.

그러나 VS2008 goto 정의는 올바르게 작동하지만 Assembly1의 올바른 방법을 가리 킵니다.

다른 사람이이 문제를 경험했거나 문제가 무엇인지 알면 누구나 가능합니까?

+0

IConcreteCollection은 어디에 정의되어 있습니까? 세 가지 어셈블리 모두에서 유형에 대한 전체 * 예제를 제공 할 수 있다면 도움이됩니다. –

+0

@Jon : 사과. IConcreteCollection은 다른 어셈블리 (예 : Assembly4)에 정의되며이 예제에서는 Assembly2에서만 참조됩니다. – Ian

+0

* 아무 것도 * Assembly2에 대한 참조가 있습니까? 이것은 매우 이상하게 들리지만 완전한 예제가 실제로 도움이 될 것입니다. 완전히 깨끗한 빌드를하면 문제가 해결됩니까? –

답변

1

이제 질문을 업데이트 했으므로 오류가 완벽합니다. Assembly4에서 형식을 참조하는 Assembly1에 public 메서드를 사용하려는 경우 해당 메서드 Assembly1을 사용하는 사람 은 Assembly4에 대한 참조가 필요합니다. 기본적으로 컴파일러는 후보 메서드를 살펴보고 적용 가능한지 여부를 결정하기에 충분하지 않습니다.

Assembly4의 Assembly3에 대한 참조를 Assembly4에서 추가하기 만하면됩니다. 이 참조를 추가하려면을 원하지 않으면 메소드 중 하나의 이름을 변경하거나 내부/개인으로 변경해야합니다. 컴파일러에서 이해할 수없는 서명을 검사하지 마십시오.

+0

흠, 그 경우의 행동을 이해합니다.우리가 VS에서 타입을 결정할 수 있고 컴파일러가이 케이스를 처리 할 수있을 것이라고 약간 이상하다고 생각하지만, 왜 그것이 제한이되는지 알 수 있습니다. 나는이 경우 어셈블리가 서로 불가지론 스럽기 때문에 그 주위를 돌아 다녔다. 대답 할 시간을내어 주셔서 감사합니다. – Ian

+0

@Ian :'IConcreteCollection'이'CustomClass []'로부터 사용자 정의 변환을 가진 타입이라고 상상해보십시오 - 불가능하지 않습니다 ... –

관련 문제