2012-06-05 34 views
5

Nhóm của chúng tôi gần đây đã di chuyển từ Visual Studio 2008/.NET3.5 sang Visual Studio 2010/.NET4.0. Bây giờ, VS2010 cho tôi một thông báo lỗi lạ. Đó là tái sản xuất với các chương trình sau đây:Loại 'X' không tồn tại trong loại 'Y.Z'

using System; 

namespace Some.Main 
{ 
} 

namespace SomeLib 
{ 
    interface Some 
    { 
    } 
} 

namespace ConsoleApplication1 
{ 
    using Some.Main; 
    using SomeLib; 

    class Program 
    { 
     static void Main(string[] args) 
     { 
      Console.Write("Press enter to continue"); 
      Console.ReadLine(); 
     } 
    } 
} 

này chỉ làm việc tốt trong VS2008, nhưng trong VS2010 tôi nhận được thông báo lỗi sau:

Loại tên 'chính' không tồn tại trong các loại ' SomeLib.Some '

Thật thú vị, nếu tôi nhấn' Xây dựng giải pháp ', chương trình xây dựng tốt, và tôi thậm chí có thể thực hiện nó mà không có bất kỳ vấn đề. Nó chỉ là Visual Studio mà dường như có một vấn đề với mã này.

Thật không may, tôi đang làm việc trên một ứng dụng kế thừa lớn và tôi không thể (dễ dàng) thay đổi tên của các không gian tên này.

Tôi muốn biết cách khắc phục lỗi này và tôi cũng tò mò điều gì gây ra lỗi này.

+2

thử 'sử dụng toàn cầu :: Some.Main; ' –

+1

Thật buồn cười. Mã chính xác đó, biên dịch trên Mono (mới nhất). Nhưng trên Visual Studio 2010, nó không –

+1

@MichaelBuen Nó thậm chí còn tồi tệ hơn, bởi vì trên Visual Studio 2008, nó cũng biên dịch. – jqno

Trả lời

9

Bạn chỉ cần thực hiện các biên tập viên nhầm lẫn. Some là cả không gian tên và tên giao diện, rõ ràng nó không kiểm tra/phân tích cú pháp using theo thứ tự chúng được khai báo.

Nếu bạn muốn nói rõ bạn đang đề cập đến không gian tên và không tên loại chỉ cần thêm global:: đến việc khai using (để bắt đầu từ gốc namespace), như thế này:

using global::Some.Main; 

CẬP NHẬT
bài rất tốt ở đây trên SO liên kết bởi @ Alex trong một chú thích: Should 'using' statements be inside or outside the namespace?

1

Hãy thử điều này:

using Some.Main; 
using SomeLib; 

namespace ConsoleApplication1 
{ 
    // instead of placing usings here. 
} 
+1

Nó làm việc, mặc dù. – jqno

+2

Cẩn thận, di chuyển 'sử dụng' s xung quanh có thể dẫn đến vi phạm mã và nên * không * được thực hiện một cách mù quáng! Xem http: // stackoverflow.com/questions/125319/nên-usings-be-bên trong hoặc bên ngoài-the-namespace – Alex

+0

@alex: tuy nhiên tôi luôn luôn đặt bằng cách sử dụng ra khỏi không gian tên và không bao giờ nghe thấy bất kỳ vấn đề. – abatishchev

4

tôi nghĩ IntelliSense là nhầm lẫn bởi việc đặt tên và không "hiểu" ai là ai.

Ảnh chụp màn hình đính kèm thể hiện những gì đang diễn ra: IntelliSense "nghĩ" Some.Main đề cập đến giao diện có tên Some, có thể do không có không gian tên được gọi là Some ở bất kỳ đâu.

May mắn thay, trình biên dịch không bị lừa như vậy và mã dường như hoạt động tốt, như bạn đã nói.

IntelliSense being fooled

+0

Và sau khi bạn xây dựng, IntelliSense cũng ngừng phàn nàn. –

+0

@HenkHolterman Cho đến khi bạn thực hiện thay đổi; sau đó nó trở lại :). – jqno

+0

@HenkHolterman Và điều đó vui hơn, tôi đã thử xây dựng nó, nó biên dịch. Tuy nhiên, nó có lỗi khi bạn thực hiện thay đổi mã. Nhóm Visual Studio IDE và nhóm biên dịch C# có phải là một nhóm riêng biệt không? –

Các vấn đề liên quan