'namespace' nhưng được sử dụng giống như một 'type'


83

Đây là chương trình của tôi mà lớp sử dụng nó được gọi là Time2 Tôi đã thêm tham chiếu vào TimeTest. Tôi tiếp tục nhận được Lỗi 'Time2' là một 'không gian tên' nhưng được sử dụng giống như một 'loại'

Ai đó có thể vui lòng cho tôi biết lỗi này là gì và làm thế nào để sửa chữa nó?

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

8
Bạn có kiểu TimeTest.TimeTest (và những người khác thích nó). Đừng làm vậy. Đừng đặt tên một kiểu giống với không gian tên của nó, bạn sẽ tạo ra lỗi không rõ ràng.
Anthony Pegram

Để biết thêm thông tin, hãy xem: blog.msdn.com/b/ericlippert/archive/2010/03/09/…
Anthony Pegram

1
Bạn thực sự nên thêm một khai báo (đã rút gọn) Time2cho câu hỏi này, vì đó có thể là nơi vấn đề nằm ở chỗ. Rất có thể bạn đã được Time2xác định trong một không gian tên được gọi làTime2
JerKimball

1
TheAce, lần sau hãy cố gắng cung cấp mẫu tối thiểu tái tạo sự cố. Tôi đã xóa những dòng không cần thiết, vui lòng thêm định nghĩa Time2 để hoàn chỉnh.
Alexei Levenkov

Câu trả lời:


123

Tôi nghi ngờ bạn đã gặp vấn đề tương tự ít nhất hai lần .

Đây:

namespace TimeTest
{
    class TimeTest
    {
}

... bạn đang khai báo một kiểu có cùng tên với không gian tên mà nó nằm trong đó. Đừng làm vậy.

Bây giờ bạn dường như có cùng một vấn đề với Time2. Tôi nghi ngờ nếu bạn thêm:

using Time2;

vào danh sách các usinglệnh của bạn, mã của bạn sẽ được biên dịch. Nhưng làm ơn, làm ơn, hãy khắc phục vấn đề lớn hơn: sự lựa chọn tên có vấn đề. (Theo liên kết ở trên để tìm hiểu thêm chi tiết về lý do tại sao đó là một ý tưởng tồi.)

(Ngoài ra, trừ khi bạn đang thực sự quan tâm đến việc viết các loại theo thời gian, tôi muốn khuyên bạn không nên làm như vậy ... và tôi nói rằng khi một người không làm chính xác điều đó. Sử dụng được xây dựng trong khả năng, hoặc một phần ba thư viện bên chẳng hạn như, ừm, của tôi . Làm việc với ngày và giờ một cách chính xác thật đáng ngạc nhiên. :)


1
Tôi đã thay đổi tên không gian tên và khắc phục sự cố. Điều đó thực sự kỳ lạ vì nó là mã mặc định được tạo bởi VS2019.
Tim Melton

1
@TimMelton: Chà, nó sẽ là mặc định nếu bạn chọn tên không gian tên TimeTest và sau đó chọn tên lớp TimeTest. Bạn sẽ phải chọn cả hai cùng ...
Jon Skeet

Tôi thấy vấn đề bây giờ. video tôi đang xem đã cho tôi tạo một thư mục có tên Bộ điều khiển để đặt các tệp Bộ điều khiển vào. Đây là nơi Bộ điều khiển trong không gian tên đến. VS tự động gắn tên thư mục vào không gian tên. Loại bỏ từ Controller sau khi Namespace khắc phục sự cố.
Tim Melton

Điều đó đã sửa nó! cảm ơn. đôi khi Visual Studio hiển thị một số thông báo lỗi gây hiểu nhầm có thể gây khó chịu.
theITvideos

Trong trường hợp của tôi, bằng cách nào đó, tôi đã tìm cách lấy tham chiếu đến một thư viện cũ có vấn đề về tên trùng lặp này mà tôi nghĩ rằng tôi đã giết chết bằng lửa nhiều năm trước.
Wildcat Matt

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

Xóa từ bộ điều khiển khỏi bảng tên


Gắn cờ là không phải là một câu trả lời, tôi sửa nó khi tôi đã không đọc những câu hỏi
Danh

1
Khi bạn cố gắng kế thừa từ lớp Bộ điều khiển trong không gian tên Microsoft.AspNetCore.Mvc, nếu thư mục của bạn được gọi là Bộ điều khiển, chứ không phải Bộ điều khiển "s", bạn có không gian tên cuối cùng là Bộ điều khiển sẽ gặp lỗi do tên của không gian tên. Câu trả lời này đúng và giúp tôi thấy rằng tôi đã đặt sai tên cho thư mục Bộ điều khiển trong dự án của mình.
Elek Guidolin

Điều này đã khắc phục sự cố của tôi. Cảm ơn vì câu trả lời rất rõ ràng!
Carthax

1

Nếu bạn đang làm việc trên một ứng dụng lớn và không thể thay đổi bất kỳ tên nào, bạn có thể nhập a .để chọn loại bạn muốn từ không gian tên:

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

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

0

Vui lòng kiểm tra xem tên lớp và không gian tên của bạn có giống nhau không ...

Nó xảy ra khi không gian tên và tên lớp giống nhau. làm một việc là viết tên đầy đủ của không gian tên khi bạn muốn sử dụng không gian tên.

using Student.Models.Db;

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

0

Tôi đã gặp sự cố này khi tạo một lớp "Response.cs" bên trong một thư mục có tên "Phản hồi". Vì vậy, VS đã bắt giữ new Response ()dưới dạng Thư mục / không gian tên.

Vì vậy, tôi đã đổi tên lớp thành StatusResponse.cs và gọi new StatusResponse(). Điều này đã giải quyết được vấn đề.


0

Tất cả các câu trả lời đều chỉ ra nguyên nhân, nhưng đôi khi vấn đề lớn hơn là xác định tất cả những nơi xác định không gian tên không đúng. Với các công cụ như Resharper tự động điều chỉnh không gian tên bằng cách sử dụng cấu trúc thư mục, rất dễ gặp phải vấn đề này.

Bạn có thể nhận được tất cả các dòng tạo ra sự cố bằng cách tìm kiếm trong dự án / giải pháp bằng cách sử dụng regex sau:

namespace .+\.TheNameUsedAsBothNamespaceAndType

-3

nếu lỗi là

Dòng 26:
Dòng 27: @foreach (Khách hàng là khách hàng trong Mô hình) Dòng 28: {Dòng 29:

cung cấp không gian tên đầy đủ
như @foreach (khách hàng Start.Models.customer trong Model)

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.