Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2008/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Visual studio 2008 C#VS2008编译器拾取错误的方法_Visual Studio 2008_C# 2.0 - Fatal编程技术网

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

Visual studio 2008 C#VS2008编译器拾取错误的方法,visual-studio-2008,c#-2.0,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), CLSCo

在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)
{}
[DebuggerHidden]
公共静态列表列表(此IEnumerable源)
{}
[System.Runtime.InteropServices.ComVisible(false),CLSCompliant(false)]
公共静态列表列表(此IConcreteCollection集合)
{}
Assembly3:仅引用Assembly1。请注意,CustomClass不实现IConcreteCollection

List<CustomClass> list = new CustomClass[].ToList();
List List=new CustomClass[].ToList();
Assembly4:IConcreteCollection已定义


错误消息:

类型 “Assembly4.Namespace.IConcreteCollection”为 在未定义的程序集中定义 参考。您必须添加一个引用 到程序集“Assembly4.Namespace,版本=…”


如您所见,Assembly3错误地尝试在Assembly1中使用错误的扩展,尽管类型不匹配

然而,VS2008 goto定义工作正常,并指向Assembly1中的正确方法


其他任何人都经历过这种情况,或者知道可能是什么问题吗?

好的,现在您已经更新了问题,错误是完全有道理的。如果在Assembly1中有一个引用Assembly4中的类型的公共方法,任何可能使用该方法Assembly1的人都需要对Assembly4的引用。基本上,编译器只是查看候选方法,并不知道它是否适用


只需从Assembly4中添加对Assembly3的引用,就可以了。如果不想添加该引用,则应更改其中一个方法的名称,或将其设置为内部/私有。不要要求编译器检查它不理解的签名:)

IConcreteCollection在哪里定义?如果你能给出一个完整的例子,说明所有三个程序集中的类型,那会有所帮助。@Jon:抱歉。IConcreteCollection将在另一个程序集(即Assembly4)中定义,在本例中仅由Assembly2引用。那么是否有任何东西引用Assembly2?这听起来很奇怪,但是一个完整的例子会很有帮助。如果你做了一个完全干净的构建,那会修复它吗?@Jon:我看了看是否有任何东西引用了assembly2,并在我的示例中发现了一个错误。不同的名称空间相同的程序集:S。两个扩展方法实际上都在同一个程序集中(很抱歉)。然而,Assembly3对IConcreteCollection一无所知。完全重建并不能解决问题。嗯,我理解这种情况下的行为。我觉得有点奇怪,我们可以确定VS中的类型,并希望编译器能够处理这种情况,但我明白为什么这可能是一个限制。我已经解决了这个问题,因为在这种情况下,这些组件应该彼此不可知。感谢您花时间回答。@Ian:想象一下,如果
IContraceteCollection
是一种从
CustomClass[]
进行用户定义转换的类型-这不是不可能的。。。