【发布时间】:2011-01-27 10:59:25
【问题描述】:
我在 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 中的正确方法。
其他人遇到过这种情况或知道可能是什么问题吗?
【问题讨论】:
-
IConcreteCollection 在哪里定义?如果您可以给出一个包含所有三个程序集中类型的完整示例,那将有所帮助。
-
@Jon:抱歉。 IConcreteCollection 将在另一个程序集中定义(因此 Assembly4),在本示例中仅由 Assembly2 引用。
-
那么 anything 是否引用了 Assembly2?这听起来很奇怪,但一个完整的例子真的很有帮助。如果你做了一个完全干净的构建,那能解决它吗?
-
@Jon:我查看了是否有任何东西引用了 assembly2 并在我的示例中发现了一个错误。不同的命名空间相同的程序集:S。两种扩展方法实际上都在同一个程序集中(对此感到抱歉)。然而,Assembly3 对 IConcreteCollection 一无所知。完全重建并不能解决问题。