假设我们有 3 层应用程序,并且有三个名为 P1、P2、P3 的项目。
依赖关系:P1(数据)<< P2(业务逻辑)<< P3(表示)
P2 有一个基类 X,它是在 P2 的另一个类 Y 中继承的。因此,我们将引用 P1 添加到 P2。但是,P3 使用 P2.Y 而不是直接使用 P1.X。
为此,我们必须将 ref P2 添加到 P3。但是 VB 和 C# 之间存在差异。
在 VB 中,我们仅将引用 P2 添加到 P3。 P2 使用 P1 但对 P3 无关紧要。我们不需要将 ref P1 添加到 P3。够了!
但是,在 C# 中,我们必须将 ref P1 和 P2 都添加到 P3,即使 P3 不使用 P1.X 也是如此。如果您不将 ref A 添加到 C,您会收到以下错误:
类型“P1.X”在未引用的程序集中定义。您必须添加对程序集“P1,Version=1.0.0.0,Culture=neutral,PublicKeyToken=null”的引用。
为什么我们必须在 C# 中添加两个项目?
或者,我们可以阻止这种行为吗?
最佳答案
一个可能的原因是 P2 公开了其类型在 P1 中定义的成员。在那种情况下,P1 也必须在 P3 中引用,即使您没有在 P3 中明确使用它也是如此。
例子:
// Assembly P1
public class C1
{
...
}
// Assembly P2
public class C2
{
public string Foo { get; set; }
public C1 Bar { get; set; }
}
// Assembly P3
void Main()
{
C2 c = ...
Console.WriteLine(c.Foo);
}
在上面的代码中,P3使用了C2(在P2中定义),而C2暴露了一个C1类型的成员(在P1中定义),所以P3必须引用P1(即使它没有使用C2.Bar )罢工>。
编辑:实际上我错了:只有在引用 C2.Bar
时才必须引用 P1 ... VB 中的行为与 C# 中的行为完全相同,我只是尝试过(如果您不添加对 P1 的引用,您会得到 this error )。如果您以前在 VB 项目中没有此约束,那只是因为 P3 没有使用任何依赖于 P1 的东西。
关于c# - C# 引用依赖项与 VB 不同吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7862794/