C # VS2008 компилятор неправильно выбирает методы - PullRequest
0 голосов
/ 27 января 2011

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


Assembly1: References 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: Только References Assembly1,Обратите внимание, что CustomClass не реализует IConcreteCollection.

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

Assembly4: Определена IConcreteCollection.


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

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


Как видите, Assembly3 неправильно попыталась использовать неправильное расширение в Assembly1, несмотря на то, чтоДело в том, что типы не совпадают.

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

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

1 Ответ

1 голос
/ 27 января 2011

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

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

...