"простір імен", але використовується як "тип"


87

Це моя програма, яку використовує клас, вона називається Time2. У мене є посилання, додане до TimeTest. Я постійно отримую помилку "Time2" - це "простір імен", але використовується як "тип"

Хтось може сказати мені, що це за помилка і як її виправити?

namespace TimeTest
{
  class TimeTest
  {
    static void Main(string[] args)
    {
        Time2 t1 = new Time2();
    }
  }
}

8
Ви маєте тип TimeTest.TimeTest (і іншим подобається). Не роби цього. Не називайте тип таким самим, як його простір імен, ви створюєте помилки двозначності.
Ентоні Пеграм

Для отримання додаткової інформації див .: blogs.msdn.com/b/ericlippert/archive/2010/03/09/…
Ентоні

1
Ви дійсно повинні додати (позбавлену) декларацію Time2до цього питання, оскільки, мабуть, саме в цьому полягає проблема. Швидше за все, вас Time2визначили у просторі імен під назвоюTime2
JerKimball

1
TheAce, будь ласка, наступного разу постарайся надати мінімальний зразок, що відтворює проблему. Я видалив непотрібні рядки. Будь ласка, додайте визначення Time2, щоб заповнити його.
Олексій Левенков

Відповіді:


126

Я підозрюю, що у вас одна і та ж проблема принаймні двічі .

Тут:

namespace TimeTest
{
    class TimeTest
    {
}

... ви оголошуєте тип з тим самим іменем, що і простір імен, в якому він знаходиться. Не робіть цього.

Зараз у вас, мабуть, така сама проблема Time2. Я підозрюю , що якщо додати:

using Time2;

до вашого списку usingдиректив, ваш код буде скомпільований. Але будь ласка, будь ласка, будь ласка, виправте більшу проблему: проблемний вибір імен. (Перейдіть за посиланням вище, щоб дізнатись більше деталей, чому це погана ідея.)

(Крім того, якщо ви насправді не зацікавлені в написанні типів часу, я б радив вам цього не робити ... і я кажу це як хтось, хто робить саме це. Використовуйте вбудовані можливості, або партійна бібліотека, така як, м-м, моя . Правильна робота з датами та часом - це напрочуд волохато.


1
Я змінив назву простору імен і вирішив проблему. Це насправді дивно, оскільки це код за замовчуванням, згенерований VS2019.
Тім Мелтон,

1
@TimMelton: Ну, це буде за замовчуванням, якщо ви вибрали ім'я простору імен TimeTest, а потім також вибрали назву класу TimeTest. Вам доведеться обидва обирати однаково ...
Джон Скіт,

Я бачу проблему зараз. відео, яке я переглядав, змусило мене створити папку з іменем Controller, куди слід помістити файли Controller. Звідси взявся Controller у просторі імен. VS автоматично додає ім'я папки до простору імен. Видалення контролера слова після простору імен вирішує проблему.
Тім Мелтон,

Це виправило! Дякую. іноді Visual Studio відображає деякі оманливі повідомлення про помилки, що може викликати неприємності.
thevidevideos

У моєму випадку мені якось вдалося взяти посилання на стару бібліотеку, у якої була така проблема, що перетинається з іменами, яку я думав, що вбив вогнем багато років тому.
Wildcat Matt

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

Видаліть слово контролера з namepsace


Позначений як не відповідь, я відредагував його, коли не прочитав запитання
Дан,

1
При спробі успадкувати від класу Controller у просторі імен Microsoft.AspNetCore.Mvc, якщо ваша папка називається Controller, а не Controller "s", у вас є остаточний простір імен, оскільки Controller видає помилку через ім'я простору імен. Ця відповідь правильна і допомогла мені зрозуміти, що я дав неправильне ім’я контролерам папок у своєму проекті.
Elek Guidolin

Це вирішило мою проблему. Дякую за дуже чітку відповідь!
Карфакс

2

Якщо ви працюєте над великим додатком і не можете змінити жодного імені, ви можете ввести a, .щоб вибрати потрібний тип із простору імен:

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

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

1

У мене була ця проблема, коли я створив клас "Response.cs" всередині папки з назвою "Response". Отже, VS ловив new Response ()папку / простір імен.

Тож я змінив назву класу на StatusResponse.cs і зателефонував new StatusResponse(). Це вирішило проблему.


1

Усі відповіді вказують на причину, але інколи більшою проблемою є визначення всіх місць, що визначають неправильний простір імен. За допомогою таких інструментів, як Resharper, які автоматично регулюють простір імен за допомогою структури папок, досить легко зіткнутися з цією проблемою.

Ви можете отримати всі рядки, що створюють проблему, здійснивши пошук у проекті / рішенні, використовуючи такий регулярний вираз:

namespace .+\.TheNameUsedAsBothNamespaceAndType

0

Переконайтесь, що назва класу та простору імен однакові ...

Це трапляється, коли простір імен та назва класу однакові. зробіть одне, напишіть повне ім'я простору імен, коли ви хочете використовувати простір імен.

using Student.Models.Db;

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

-3

якщо помилка

Рядок 26:
Рядок 27: @foreach (клієнт-клієнт у моделі) Рядок 28: {Рядок 29:

дайте повний простір імен,
наприклад @foreach (замовник Start.Models.customer у моделі)

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.