"命名空间"被用作"类型"。

119
我的程序使用了一个叫做Time2的类。我已经将引用添加到了TimeTest中,但是我一直收到错误提示:'Time2'是一个'namespace',但被用作'type'。请问有人能告诉我这个错误是什么意思,以及如何解决吗?
    namespace TimeTest
    {
      class TimeTest
      {
        static void Main(string[] args)
        {
            Time2 t1 = new Time2();
        }
      }
    }

16
不要给类型(比如 TimeTest.TimeTest)起与其命名空间相同的名称,这样会产生歧义错误。请避免这样做。 - Anthony Pegram
更多信息请参见:http://blogs.msdn.com/b/ericlippert/archive/2010/03/09/do-not-name-a-class-the-same-as-its-namespace-part-one.aspx - Anthony Pegram
1
你真的应该在这个问题中添加一个(简化的)Time2 声明,因为那可能是问题所在。很可能你已经在名为 Time2 的命名空间中定义了 Time2 - JerKimball
1
TheAce,请下次尝试提供最小的可重现问题示例。我已经删除了不必要的行,请添加Time2定义以使其完整。 - Alexei Levenkov
12个回答

171

我猜您至少遇到了同样的问题两次。

这里:

    namespace TimeTest
    {
        class TimeTest
        {
    }

您正在声明与其所在命名空间相同的类型。请勿这样做。

现在,您似乎也遇到了与Time2相同的问题。我猜测如果您添加以下代码:

    using Time2;

using指令添加到您的列表中,您的代码将编译。但请注意,一定要解决更大的问题:不良名称的选择。(请点击上面的链接以了解更多详细信息,为什么这是个坏主意。)
(此外,除非您真的有兴趣编写基于时间的类型,否则我建议您不要这样做……我说的是作为一个确实这样做的人。使用内置功能或第三方库,如mine。正确处理日期和时间非常棘手。 :))

4
我修改了命名空间并解决了问题。这真的很奇怪,因为这是VS2019生成的默认代码。 - Tim Melton
1
@TimMelton:如果您选择了命名空间名称TimeTest并选择了类名TimeTest,那么它将成为默认选项。您必须同时选择它们两个相同... - Jon Skeet
2
我现在明白问题了。我看的视频让我创建一个名为Controller的文件夹来放置控制器文件。这就是命名空间中的Controller来自的地方。VS会自动将文件夹名称附加到命名空间上。在命名空间后删除单词Controller可以解决问题。 - Tim Melton
搞定了!谢谢。有时候Visual Studio会显示一些误导性的错误信息,这可能会让人感到沮丧。 - theITvideos
Visual Studio 2017-2019 -> 我发现的小技巧是,你可以进入项目属性,将默认命名空间更改为其他内容,整个项目将更新所有类中的命名空间引用到新的命名空间。 - moto_geek
显示剩余3条评论

26
namespace TestApplication // Remove .Controller
{
    public class HomeController : Controller
    {
       public ActionResult Index()
        {
            return View();
        }
    }
}

从命名空间中移除控制器单词


1
被标记为不是答案,当我还没有阅读问题时进行了编辑。 - Danh
1
当您尝试从Microsoft.AspNetCore.Mvc命名空间中的Controller类继承时,如果您的文件夹名为Controller而不是Controllers,则最终的命名空间将为Controller,这会因命名空间名称而导致错误。这个答案是正确的,并帮助我看到我在项目中给文件夹Controllers赋了错误的名称。 - Elek Guidolin
这解决了我的问题。感谢你提供的非常清晰的答案! - Carthax
感谢您的快速和明确的回答,修复了我的错误! - Junaid khan
检查所有可能在命名空间中包含单词“Controller”的文件。在我的情况下,该命名空间中只有一个文件的名称是“Controller”,而不是文件夹名称“Controllers”。一个拼写错误的文件可能会导致其他问题。 - cvillalobosm

8

class TimeTest 类和 namespace TimeTest 命名空间冲突。

如果您无法更改命名空间和类名称:

为该类类型创建一个别名。

using TimeTest_t = TimeTest.TimeTest;

TimeTest_t s = new TimeTest_t();

这对我来说不起作用,将using语句放在文件的顶部。using语句必须在类的命名空间内部。 - Jess

6

所有的答案都指出了问题的原因,但有时更大的问题是识别定义不正确的命名空间的所有位置。使用像Resharper这样的工具可以根据文件夹结构自动调整命名空间,因此很容易遇到此问题。

您可以通过在项目/解决方案中使用以下正则表达式进行搜索,获取创建此问题的所有行:

namespace .+\.TheNameUsedAsBothNamespaceAndType

4

如果你正在开发一款大型应用程序,不能更改任何名称,你可以键入一个 . 来从命名空间中选择所需的类型:

namespace Company.Core.Context{
  public partial class Context : Database Context {
    ...
  }
}
...

using Company.Core.Context;
someFunction(){
 var c = new Context.Context();
}

2

我曾经遇到过这个问题,因为我在名为 "Response" 的文件夹中创建了一个名为 "Response.cs" 的类。因此,VS将 new Response() 视为文件夹/命名空间。

所以我将类名更改为 StatusResponse.cs 并调用 new StatusResponse()。这解决了问题。


1
如果您在这里寻求与EF Core相关的问题,这是一个提示: 将Migration的子文件夹命名为与Database Context的名称不同
这将为您解决问题。
我的错误类似于这样: ModelSnapshot.cs error CS0118: Context is a namespace but is used like a type

1
这种情况是由于文件夹和类名相同而引起的。因此,命名空间和类名之间产生了混淆。
namespace CSEData.Scrapper.UnitOfWork
    {
        public class UnitOfWork
        {
            Task<int> Commit(){};
            void Dispose(){};
        }
    }

看一下命名空间,它是"UnitOfWork"。再看一下类名,也是"UnitOfWork"。所以我把命名空间的名称(在我的情况下是文件夹名称)改成了"UnitOfWorks"。

这个问题已经有十一个现有答案,包括一个得票最高、被接受的答案,获得了一百多票。你确定你的解决方案还没有被提出过吗?如果不是,请说明为什么你认为你的方法比已经得到社区验证的现有建议更好。在 Stack Overflow 上提供解释总是很有用的,但在问题已经得到提问者和社区满意解决的情况下尤其重要。通过解释你的答案与众不同之处及其适用性,帮助读者更好地理解。 - Jeremy Caney

0
namespace Test //Remove .Controller

{ 公共类 HomeController : 控制器 { 公共 IActionResult Index() { 返回视图(); } } }

//这是一个好主意。


感谢您为Stack Overflow社区做出的贡献。这可能是一个正确的答案,但如果您能提供代码的额外解释,那将非常有用,这样开发人员就可以理解您的推理过程。对于不太熟悉语法或难以理解概念的新开发人员来说,这尤其有用。为了造福社区,您能否编辑您的答案并包含更多细节呢? - Jeremy Caney

0
请检查您的类和命名空间名称是否相同...
当命名空间和类名相同时会出现这种情况。 做一件事,在使用命名空间时写出完整的命名空间名称。
using Student.Models.Db;

namespace Student.Controllers
{
    public class HomeController : Controller
    {
        // GET: Home
        public ActionResult Index()
        {
            List<Student> student = null;
            return View();
        }
    }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接