'ad alanı' ancak bir 'tür' gibi kullanılır


87

Bu benim programım, sınıfın kullandığı Zaman2 olarak adlandırılıyor Zaman Testine referans ekledim Hatayı almaya devam ediyorum 'Zaman2' bir 'ad alanı' ama 'tür' gibi kullanılıyor

Birisi bana bu hatanın ne olduğunu ve nasıl düzeltileceğini söyleyebilir mi?

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

8
TimeTest.TimeTest (ve bunun gibi diğerleri) yazdınız. Bunu yapma. Bir türü ad alanıyla aynı şekilde adlandırmayın, belirsizlik hataları yaratırsınız.
Anthony Pegram


1
Time2Bu soruya gerçekten bir (basitleştirilmiş) bir açıklama eklemelisiniz , çünkü muhtemelen sorunun kaynağı budur. Büyük olasılıklaTime2Time2
JerKimball

1
TheAce, lütfen bir dahaki sefere sorunu yeniden üreten minimum örnek sağlamaya çalışın. Gerekli olmayan satırları kaldırdım, lütfen tamamlamak için Time2 tanımı ekleyin.
Alexei Levenkov

Yanıtlar:


126

Sanırım aynı sorunu en az iki kez yaşıyorsunuz .

Buraya:

namespace TimeTest
{
    class TimeTest
    {
}

... içinde bulunduğu ad alanıyla aynı adı taşıyan bir türü bildiriyorsunuz. Bunu yapma.

Şimdi görünüşe göre aynı sorunu yaşıyorsunuz Time2. Ben şüpheli eklerseniz:

using Time2;

usingdirektifler listenize, kodunuz derlenecektir. Ama lütfen, lütfen, lütfen daha büyük sorunu çözün: sorunlu isim seçimi. ( Neden kötü bir fikir olduğuna dair daha fazla ayrıntı öğrenmek için yukarıdaki bağlantıyı izleyin .)

(Ek olarak, zamana dayalı türler yazmakla gerçekten ilgilenmiyorsanız, bunu yapmamanızı tavsiye ederim ... ve bunu tam olarak yapan biri olarak diyorum . Yerleşik yetenekleri veya üçüncü bir parti kitaplığı, um, benim gibi . Tarihler ve saatlerle doğru çalışmak şaşırtıcı bir şekilde tüylü. :)


1
Ad alanı adını değiştirdim ve sorunu çözdüm. Bu gerçekten garip çünkü VS2019 tarafından oluşturulan varsayılan kod.
Tim Melton

1
@TimMelton: TimeTest ad alanı adını seçtiyseniz ve ardından TimeTest sınıf adını seçtiyseniz, bu varsayılan olacaktır. İkisini de aynı şekilde seçmelisin ...
Jon Skeet

Sorunu şimdi anlıyorum. İzlediğim video, Controller dosyalarını yerleştirmek için Controller adında bir klasör oluşturmamı sağladı. Bu, ad alanındaki Controller'ın geldiği yerdir. VS auto, klasör adını ad alanına ekler. Ad alanından sonra Controller kelimesinin kaldırılması sorunu çözer.
Tim Melton

Bu onu düzeltti! Teşekkürler. bazen Visual Studio, sinir bozucu olabilecek bazı yanıltıcı hata iletileri görüntüler.
theITvideos

Benim durumumda, yıllar önce ateşle öldürdüğümü sandığım bu örtüşen isim problemine sahip eski bir kütüphaneden bir şekilde referans almayı başardım.
Wildcat Matt

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

Denetleyici sözcüğünü namepace'den kaldırın


Cevap değil olarak işaretlendi, soruyu okumadığım zaman düzenledim
Danh

1
Microsoft.AspNetCore.Mvc ad alanındaki Controller sınıfından devralmayı denediğinizde, klasörünüz Controller "s" değil de Controller olarak adlandırılıyorsa, son ad alanına sahip olursunuz, Controller olarak ad alanı adı nedeniyle bir hata atar. Bu cevap doğrudur ve projemdeki Denetleyiciler klasörüne yanlış ad verdiğimi görmeme yardımcı oldu.
Elek Guidolin

Bu benim sorunumu çözdü. Çok net cevap için teşekkürler!
Carthax

2

Büyük bir uygulama üzerinde çalışıyorsanız ve herhangi bir adı değiştiremiyorsanız ., ad alanından istediğiniz türü seçmek için a yazabilirsiniz:

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

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

1

Bu sorunu, "Response" adlı bir klasörün içinde "Response.cs" sınıfını oluştururken yaşadım. Yani VS, new Response ()Klasör / ad alanı olarak yakalıyordu .

Bu yüzden sınıf adını StatusResponse.cs olarak değiştirdim ve aradım new StatusResponse(). Bu sorunu çözdü.


1

Tüm yanıtlar nedeni belirtir, ancak bazen daha büyük sorun, uygunsuz bir ad alanını tanımlayan tüm yerleri tanımlamaktır. Klasör yapısını kullanarak ad alanını otomatik olarak ayarlayan Resharper gibi araçlarla bu sorunla karşılaşmak oldukça kolaydır.

Aşağıdaki regex kullanarak proje / çözüm içinde arayarak sorunu oluşturan tüm satırları alabilirsiniz:

namespace .+\.TheNameUsedAsBothNamespaceAndType

0

Lütfen sınıfınızın ve ad alanı adınızın aynı olup olmadığını kontrol edin ...

Ad alanı ve sınıf adı aynı olduğunda olur. ad alanını kullanmak istediğinizde ad alanının tam adını bir şey yazın.

using Student.Models.Db;

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

-3

eğer hata ise

26. Satır:
27. Satır: @foreach (Modeldeki müşteriler müşteri) 28. Satır: {29. Satır:


@foreach gibi tam ad alanı verin (Model'de Start.Models.customer customer)

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.