2011-01-27 1 views
0

У меня действительно странная проблема при создании проекта в VS2008. Сделав некоторые совершенно несвязанные изменения, я начал получать ошибку сборки. В основном компилятор подбирает неправильный метод расширения.C# VS2008 Компилятор подбирает неправильные методы


Ассамблеи1: Ссылки 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) 
{} 

Ассамблеей3: только Ссылки Ассамблеи1. Обратите внимание, что CustomClass не реализует IConcreteCollection.

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

Assembly4: IConcreteCollection определено.


Сообщение об ошибке:

Тип 'Assembly4.Namespace.IConcreteCollection' является определен в сборке, не ссылка. Вы должны добавить ссылку в сборку 'Assembly4.Namespace, Version = ...'.


Как вы можете видеть, Ассамблеей3 неправильно пытался использовать неправильное расширение в Ассамблеи1, несмотря на то, что типы не совпадают.

Однако VS2008 goto-definition работает правильно и указывает на правильный метод в Assembly1.

Кто-нибудь еще испытал это или знал, что может быть проблемой?

+0

Где определяется IConcreteCollection? Если бы вы могли придать * полный * пример типам во всех трех сборках, это помогло бы. –

+0

@Jon: извинения. IConcreteCollection будет определен в другой сборке (так Assembly4), только на которую ссылается Assembly2 в этом примере. – Ian

+0

Так что * ничего * есть ссылка на Assembly2? Это звучит очень странно, но полный пример действительно поможет. Если вы делаете полностью чистую сборку, это исправить? –

ответ

1

Хорошо, теперь вы обновили вопрос, ошибка имеет смысл. Если у вас будет публичный метод в Assembly1, который ссылается на тип с Assembly4, любой потенциально с использованием этого метода Assembly1 нуждается в ссылке на Assembly4. В основном компилятор просматривает метод кандидата и не знает достаточно, чтобы решить, применимо оно или нет.

Просто добавьте ссылку на Assembly3 с Assembly4, и все должно быть хорошо. Если вы не хотите, чтобы добавить эту ссылку, вы должны изменить имя одного из методов или сделать его внутренним/частным. Не просите компилятор проверить подписи, которые он не понимает :)

+0

Хм, я понимаю поведение в этом случае.Я думаю, что немного странно, что мы можем определить тип в VS и ожидаем, что компилятор сможет справиться с этим делом, но я могу понять, почему это может быть ограничение. Я работал над этим, так как в этом случае эти Ассамблеи должны быть агностиками друг от друга. Спасибо, что нашли время ответить. – Ian

+0

@Ian: Представьте, что 'IConcreteCollection' был типом, который имел пользовательское преобразование из' CustomClass [] '- это не невозможно ... –

Смежные вопросы