C# 项目和命名空间问题

Posted

技术标签:

【中文标题】C# 项目和命名空间问题【英文标题】:C# Project & Namespaces Question 【发布时间】:2011-08-15 22:03:36 【问题描述】:

我正在为自己创建一个包含在单个项目中的小型数学库,并且遇到了命名空间的一些问题。我有项目MyMathLib 和***命名空间:

namespace MyMathLib
 ... 

在一个单独的文件中......

namespace MyMathLib.Addition
 ... 

还有……

namespace MyMathLib.Subtraction
 ... 

MyMathLib.Subtraction 命名空间中,我有一个方法需要使用MyMathLib.Addition 中定义的静态方法SomeClass.Work(),因此我在减法文件的开头包含了using MyMathLib.Addition。但是当我尝试使用该方法时,我希望我首先使用Addition.SomeClass.Work() 对其进行限定,并且我希望能够只输入SomeClass.Work()。我做错了什么?

谢谢!

编辑

感谢您的建议!在每个文件中,我实际上在命名空间之后命名了类(即在命名空间MyMathLib.Addition 中是一个静态类Addition 而在MyMathLib.Subtraction 中有一个静态类Subtraction)。显然这是导致问题的原因(回头看,我应该说明这一点而不是使用SomeClass)。如果我将命名空间更改为MyMathLib.MyAddition,同时将静态类保持为Additionusing MyMathLib.MyAddition 可以按我的意愿工作;也就是说,我现在可以在我的静态 Subtraction 类中输入 Addition.Work()。我以前见过与包含命名空间相同的类,有人可以解释为什么这会导致问题吗?编译器不应该能够从代码的上下文中确定我是要使用命名空间还是类?

【问题讨论】:

方法名称是否与您引用的另一个命名空间中的另一个方法冲突? 也许您在两个命名空间中为 SomeClass 和 Work() 使用相同的名称? WorkSomeClass 的成员吗?此外,SomeClass 是否在 MyMathLib.AdditionMyMathLib.Subtraction 中都定义了? 【参考方案1】:

我猜你要么有两个名为SomeClass 的类都在你引用的命名空间中,要么你有一个名为SomeClass 的变量或属性。这两种情况中的任何一种都会使编译器无法知道您正在尝试调用静态 MyMathLib.Addition.SomeClass.Work() 方法,但编译器建议的特定解决方案使其看起来更有可能是前者。

更新

看到您的编辑,这是有道理的。如果您在MyMathLib 之外的命名空间中使用它们,那么您仍然可以避免这种命名空间冲突。但是,因为您位于 MyMathLib.Subtraction 命名空间内,所以编译器会隐式地考虑命名空间“在您之上”的任何部分优先于类名。在这种情况下,当你说“加法”时,编译器会寻找以下项目来解析名称:

    using ... = ... 指令明确标识的类。 MyMathLib.Subtraction.Addition 命名空间。 MyMathLib.Addition 命名空间。 Addition 命名空间。 using 语句标识的命名空间中的任何类。

在这种情况下,您在 #4 之前点击了 #3,因此您应该能够通过重命名类或命名空间,或者使用 Yahia 的建议 (#1) 来解决它:

using Addition = MyMathLib.Addition.Addition;

更新 2

查看您链接到的文章后,听起来明确的using 语句仍然不起作用。我猜第 1 项实际上是在第 4 项周围被评估下来的。真可惜。您可以使用别名在本地为类赋予一个不同的名称:

using Add = MyMathLib.Addition.Addition;

...

var add = new Add();

但最好的解决方案仍然可能只是通过更改命名空间或类名来完全避免命名空间冲突。

【讨论】:

感谢您的意见!我找到了一个“解决方案”,但我不确定它为什么会起作用(请参阅上面的编辑)。 嗯...我尝试了using Addition = MyMathLib.Addition.Addition,但 IntelliSense 仍然恢复到 Addition 命名空间而不是类。想法? 好吧,我刚刚在该主题上找到了this。看起来我将更改命名空间的命名。 :) @Jon:是的,这可能是最好的方法。我确定这就是为什么System.Linq.Expressions 末尾有一个s 的原因(以避免与Expression 类发生冲突。【参考方案2】:

尝试另外将流线放入减法源

using SomeClass = Addition.SomeClass;

http://msdn.microsoft.com/en-us/library/dfb3cx8s.aspxhttp://www.blackwasp.co.uk/NamespaceAliasQualifier.aspx

【讨论】:

【参考方案3】:

听起来您在减法命名空间中...将其添加到顶部,在命名空间声明中:

using Addition;

这应该可以解决问题。

【讨论】:

这很可能不起作用,因为 (a) 命名空间被称为 MyMathLib.Addition,而不仅仅是 Addition; (b) OP 已经这样做了。 我在 Visual Studio 中模拟了它并且它工作正常。当命名空间的一部分匹配时,您只需要指定命名空间的不匹配的子部分。请自行检查并删除我的 -1。

以上是关于C# 项目和命名空间问题的主要内容,如果未能解决你的问题,请参考以下文章

C#中的命名空间和程序集

C# - 在共享命名空间中跨文件使用命名空间

C#中的命名空间和程序集

C#和.Ne学习第十天

如何将 Windows.Security.Credentials.UI 命名空间包含到 C# 项目中

当顶层命名空间包含基类而内部命名空间包含子类时的 C# 命名空间和类/子类命名约定