我正在为自己创建一个包含在单个项目中的小数学库,并且遇到了名称空间的一些问题。我有项目MyMathLib
和顶级命名空间:
namespace MyMathLib
{ ... }
并在一个单独的文件中......
namespace MyMathLib.Addition
{ ... }
和...
namespace MyMathLib.Subtraction
{ ... }
在MyMathLib.Subtraction
命名空间中,我有一个方法需要使用SomeClass.Work()
中定义的静态方法MyMathLib.Addition
,所以我在减法文件的开头包含了using MyMathLib.Addition
。但是当我尝试使用该方法时,我希望首先使用Addition.SomeClass.Work()
对其进行限定,并且我希望能够只键入SomeClass.Work()
。我做错了什么?
谢谢!
修改
感谢您的建议!在每个文件中,我实际上在命名空间之后命名了类(即在命名空间MyMathLib.Addition
中是静态类Addition
而在MyMathLib.Subtraction
中有一个静态类Subtraction
)。显然这就是造成这个问题的原因(回头看,我应该说明这个问题,而不是使用SomeClass
)。如果我将名称空间更改为MyMathLib.MyAddition
,同时将静态类保持为Addition
,则using MyMathLib.MyAddition
可以按我的意愿工作;也就是说,我现在可以在静态Addition.Work()
类中输入Subtraction
。我之前看到的类名称与包含名称空间的名称相同,有人可能会解释为什么这会导致问题吗?编译器是否应该能够确定我是否要在代码的上下文中使用命名空间或类?
答案 0 :(得分:3)
我猜你要么有两个名为SomeClass
的类,它们都在你引用的命名空间中,或者你有一个名为SomeClass
的变量或属性。这些情况中的任何一种都会使编译器无法知道您正在尝试调用静态MyMathLib.Addition.SomeClass.Work()
方法,但编译器建议的特定解决方案似乎更有可能成为前者。
看到你的编辑,这是有道理的。如果您在MyMathLib
之外的命名空间中使用它们,那么您仍然可以避免此命名空间冲突。但是,因为您位于MyMathLib.Subtraction
命名空间内,所以编译器将隐式地将“命名空间”的任何部分视为优先于类名。在这种情况下,当您说“Addition”时,编译器将查找以下项目来解析名称:
using ... = ...
指令明确标识的类。MyMathLib.Subtraction.Addition
名称空间。MyMathLib.Addition
名称空间。Addition
名称空间。using
语句标识的命名空间中的任何类。在这种情况下,你在#4之前达到#3,所以你应该能够通过重命名类或名称空间,或者使用Yahia的建议(#1)来解决它:
using Addition = MyMathLib.Addition.Addition;
在查看您链接到的文章后,听起来明确的using
语句仍然不起作用。我猜项目#1实际上是在项目#4周围进行评估。游民。您可以使用别名在本地为类提供不同的名称:
using Add = MyMathLib.Addition.Addition;
...
var add = new Add();
但最好的解决方案仍然可能只是通过更改名称空间或类名来完全避免名称空间冲突。
答案 1 :(得分:1)
尝试将以下行添加到减法源
中using SomeClass = Addition.SomeClass;
http://msdn.microsoft.com/en-us/library/dfb3cx8s.aspx
http://www.blackwasp.co.uk/NamespaceAliasQualifier.aspx
答案 2 :(得分:-1)
听起来像是在Subtraction命名空间中...将它添加到命名空间声明中的顶部:
using Addition;
这应该可以解决问题。