C#VS2008编译器拾取错误的方法

时间:2011-01-27 10:59:26

标签: visual-studio-2008 c#-2.0

在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中的正确方法。

其他人经历过这个或知道可能是什么问题?

1 个答案:

答案 0 :(得分:1)

好的,现在你已经更新了问题,错误很有意义。如果你将在Assembly1中有一个引用Assembly4类型的公共方法,那么使用该方法的任何潜在 Assembly1都需要对Assembly4的引用。基本上,编译器会查看候选方法,并且不了解它是否适​​用。

只需从Assembly4添加对Assembly3的引用,一切都应该正常。如果您想要添加该引用,则应更改其中一个方法的名称,或将其设置为internal / private。不要让编译器检查它不理解的签名:)