У меня действительно странная проблема при создании проекта в 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.
Кто-нибудь еще испытал это или знал, что может быть проблемой?
Где определяется IConcreteCollection? Если бы вы могли придать * полный * пример типам во всех трех сборках, это помогло бы. –
@Jon: извинения. IConcreteCollection будет определен в другой сборке (так Assembly4), только на которую ссылается Assembly2 в этом примере. – Ian
Так что * ничего * есть ссылка на Assembly2? Это звучит очень странно, но полный пример действительно поможет. Если вы делаете полностью чистую сборку, это исправить? –