gpt4 book ai didi

C# 项目和命名空间问题

转载 作者:行者123 更新时间:2023-12-04 16:54:01 25 4
gpt4 key购买 nike

我正在为自己创建一个包含在单个项目中的小数学库,并且遇到了命名空间的一些问题。我有项目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类(class)。我以前见过名称与它包含命名空间相同的类,有人可以解释为什么这会导致问题吗?编译器不应该能够从代码的上下文中确定我是要使用命名空间还是类?

最佳答案

我猜你要么有两个名为 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;
    更新 2
    看了你链接的文章后,这听起来像是明确的 using声明仍然不起作用。我猜第 1 项实际上是围绕第 4 项进行评估的。无赖。您可以使用别名在本地为类指定不同的名称:
    using Add = MyMathLib.Addition.Addition;

    ...

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

    关于C# 项目和命名空间问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7071349/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com