„przestrzeń nazw”, ale jest używana jak „typ”


87

To jest mój program, którego używa klasa nazywa się Time2 Mam odniesienie dodane do TimeTest Ciągle otrzymuję Błąd „Time2” to „przestrzeń nazw”, ale jest używany jak „typ”

Mógłby ktoś mi powiedzieć co to za błąd i jak to naprawić?

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

8
Masz typ TimeTest.TimeTest (i inne podobne). Nie rób tego. Nie nazywaj typu tak samo, jak jego przestrzeń nazw, tworzysz błędy niejednoznaczności.
Anthony Pegram

Aby uzyskać więcej informacji, zobacz: blogs.msdn.com/b/ericlippert/archive/2010/03/09/…
Anthony Pegram

1
Naprawdę powinieneś dodać (okrojoną) deklarację Time2do tego pytania, ponieważ prawdopodobnie na tym polega problem. Najprawdopodobniej zostałeś Time2zdefiniowany w przestrzeni nazw o nazwieTime2
JerKimball,

1
TheAce, następnym razem spróbuj podać minimalną próbkę, która odtwarza problem. Usunąłem niepotrzebne wiersze, dodaj definicję Time2, aby była kompletna.
Alexei Levenkov

Odpowiedzi:


126

Podejrzewam, że masz ten sam problem co najmniej dwa razy .

Tutaj:

namespace TimeTest
{
    class TimeTest
    {
}

... deklarujesz typ o tej samej nazwie, co przestrzeń nazw, w której się znajduje. Nie rób tego.

Teraz najwyraźniej masz ten sam problem z Time2. Podejrzewam , że jeśli dodasz:

using Time2;

do listy usingdyrektyw, twój kod zostanie skompilowany. Ale proszę, proszę, rozwiąż większy problem: problematyczny wybór nazw. (Kliknij powyższy link, aby dowiedzieć się więcej o tym, dlaczego to zły pomysł).

(Dodatkowo, jeśli nie jesteś naprawdę zainteresowany pisaniem typów opartych na czasie, radziłbym ci tego nie robić ... i mówię to jako osoba, która robi dokładnie to. Użyj wbudowanych możliwości lub trzeciej Biblioteka imprezowa, taka jak moja . Praca z datami i godzinami jest zaskakująco owłosiona. :)


1
Zmieniłem nazwę przestrzeni nazw i naprawiłem problem. To naprawdę dziwne, ponieważ jest to domyślny kod generowany przez VS2019.
Tim Melton

1
@TimMelton: Cóż, będzie to ustawienie domyślne, jeśli wybrałeś nazwę przestrzeni nazw TimeTest, a następnie wybrałeś również nazwę klasy TimeTest. Musiałbyś wybrać oba takie same ...
Jon Skeet,

Teraz widzę problem. wideo, które oglądałem, kazało mi utworzyć folder o nazwie Controller, w którym zostaną umieszczone pliki kontrolera. Stąd pochodzi kontroler w przestrzeni nazw. VS auto dołącza nazwę folderu do przestrzeni nazw. Usunięcie słowa Controller po przestrzeni nazw rozwiązuje problem.
Tim Melton

To naprawiło! dzięki. czasami program Visual Studio wyświetla wprowadzające w błąd komunikaty o błędach, które mogą być frustrujące.
theITvideos

W moim przypadku jakoś udało mi się wyciągnąć odniesienie do starej biblioteki, która miała ten problem nakładania się nazwy, który, jak sądziłem, zabiłem w ogniu lata temu.
Wildcat Matt,

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

Usuń słowo kontrolera z przestrzeni nazw


Oznaczone jako brak odpowiedzi, zredagowałem je, gdy nie przeczytałem pytania
Danh

1
Podczas próby dziedziczenia z klasy Controller w przestrzeni nazw Microsoft.AspNetCore.Mvc, jeśli twój folder nosi nazwę Controller, a nie Controller "s", masz ostatnią przestrzeń nazw jako Controller, która zgłasza błąd z powodu nazwy przestrzeni nazw. Ta odpowiedź jest poprawna i pomogła mi zobaczyć, że nadałem niewłaściwą nazwę folderowi Kontrolery w moim projekcie.
Elek Guidolin

To rozwiązało mój problem. Dzięki za bardzo jasną odpowiedź!
Carthax

2

Jeśli pracujesz nad dużą aplikacją i nie możesz zmienić żadnych nazw, możesz wpisać a, .aby wybrać żądany typ z przestrzeni nazw:

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

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

1

Miałem ten problem, gdy utworzyłem klasę „Response.cs” w folderze o nazwie „Response”. Więc VS przechwytywał new Response ()as Folder / przestrzeń nazw.

Więc zmieniłem nazwę klasy na StatusResponse.cs i zadzwoniłem. new StatusResponse()To rozwiązało problem.


1

Wszystkie odpowiedzi wskazują przyczynę, ale czasami większym problemem jest zidentyfikowanie wszystkich miejsc, które definiują niewłaściwą przestrzeń nazw. Dzięki narzędziom takim jak Resharper, które automatycznie dostosowują przestrzeń nazw za pomocą struktury folderów, raczej łatwo jest napotkać ten problem.

Możesz uzyskać wszystkie wiersze, które tworzą problem, wyszukując w projekcie / rozwiązaniu za pomocą następującego wyrażenia regularnego:

namespace .+\.TheNameUsedAsBothNamespaceAndType

0

Sprawdź, czy nazwa klasy i przestrzeni nazw jest taka sama ...

Dzieje się tak, gdy przestrzeń nazw i nazwa klasy są takie same. zrób jedną rzecz, napisz pełną nazwę przestrzeni nazw, gdy chcesz jej użyć.

using Student.Models.Db;

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

-3

jeśli błąd to

Wiersz 26:
Wiersz 27: @foreach (klient klienta w modelu) Wiersz 28: {Wiersz 29:

podaj pełną nazwę,
taką jak @foreach (Start.Models.customer customer in Model)

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.