'пространство имен', но используется как 'тип'


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 для размещения файлов контроллера. Отсюда произошел контроллер в пространстве имен. VS автоматически добавляет имя папки в пространство имен. Удаление слова Controller после пространства имен устраняет проблему.
Тим Мелтон

Это исправило! Благодарю. иногда Visual Studio отображает вводящие в заблуждение сообщения об ошибках, которые могут расстраивать.
theITvideos

В моем случае мне каким-то образом удалось получить ссылку на старую библиотеку, в которой была проблема с перекрывающимися именами, которую, как мне казалось, я убил с помощью огня несколько лет назад.
Wildcat Мэтт

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

Удалите слово контроллера из namepsace


Помечено как не ответ, я отредактировал его, когда не прочитал вопрос
Дан

1
Когда вы пытаетесь наследовать от класса Controller в пространстве имен Microsoft.AspNetCore.Mvc, если ваша папка называется «Контроллер», а не «Контроллер», у вас есть последнее пространство имен как Контроллер, который выдает ошибку из-за имени пространства имен. Этот ответ верен и помог мне понять, что я дал неправильное имя папке Controllers в моем проекте.
Элек

Это устранило мою проблему. Спасибо за очень четкий ответ!
Carthax

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 () as Folder / namespace.

Поэтому я изменил имя класса на 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 customer в модели)

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.