我遇到了奇怪的行为,不知道原因。我有两个项目A和B.一个引用System.Web程序集和B引用A.我将using语句添加到项目B类using A
。它工作正常,直到我开始使用linq语句。 我收到编译错误:
The type 'System.Web.UI.Control' is defined in an assembly that is not referenced. You must add a reference to assembly 'System.Web, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a'.
简化的示例项目。两个项目父母和孩子。父项目引用System.Web。子项目引用父项目。 父项目包含一个父级:
using System.Web.UI;
namespace Parent
{
public static class Parent
{
public static T DoStuff<T>(this object obj)
where T : Control
{
return null;
}
}
}
子项目包含一个类Child:
using System.Collections.Generic;
using System.Linq;
using Parent;
namespace Child
{
public class Child
{
void Test()
{
var strings = new List<string>();
var string1 = strings.FirstOrDefault();
}
}
}
var string1 = strings.First();
引发了异常。我只想在Child项目中添加对System.Web的引用,一切正常。但我想理解为什么它会像这样工作。
如果我将父类更改为:
public static class Parent
{
public static Control DoStuff(this object obj)
{
return null;
}
}
我没有使用泛型,而是直接使用Control类。它工作正常。 有什么想法吗?
已编辑:var string1 = strings.FirstOrDefault();
答案 0 :(得分:3)
如果您引用一个项目,它会添加对其编译的dll的引用。 但是,仅仅因为您引用了一个dll并不会使您的项目以递归方式引用引用的dll引用的所有dll。
假设您将项目B的引用添加到项目A.虽然项目B引用了System.Web
,但它不会在项目A中自动引用它。
如果系统递归地添加对dll的引用,你最终会得到大量不需要的引用。
这就是为什么你仍然需要在项目A中引用所有必要的程序集手动,以便能够使用项目B中的所有内容。