在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-definition可以正常工作并指向Assembly1中的正确方法。
其他人经历过这个或知道可能是什么问题?
答案 0 :(得分:1)
好的,现在你已经更新了问题,错误很有意义。如果你将在Assembly1中有一个引用Assembly4类型的公共方法,那么使用该方法的任何潜在 Assembly1都需要对Assembly4的引用。基本上,编译器会查看候选方法,并且不了解它是否适用。
只需从Assembly4添加对Assembly3的引用,一切都应该正常。如果您想要添加该引用,则应更改其中一个方法的名称,或将其设置为internal / private。不要让编译器检查它不理解的签名:)