2009-10-27 40 views
7

Tôi đã thử nâng cấp ứng dụng ASP.Net từ Visual Studio 2005 lên 2008 và tôi đã cố gắng biên dịch để xác minh rằng nó sẽ biên dịch và tôi nhận được lỗi này.Lỗi truy cập không nhất quán

Error 1 Inconsistent accessibility: property type 'Web.Properties.UITitleSettings' is less accessible than property 'Web.Ctrl.BasePanel.UISettings' \\projectLocation\Ctrl\BasePanel.cs 25 43 ProjectName 

(tôi loại bỏ các đường dẫn lớp trước Web.Properties và Web.Ctrl, nó thường chứa nó)

Các đoạn mã tham chiếu của nó là

public Properties.UITitleSettings UISettings 
    { 
     get 
     { 
      return _uiSettings; 
     } 
    } 

Tôi không khá chắc chắn lỗi này đang cố gắng nói gì. Liệu loại cần phải được đúc (diễn viên tiềm ẩn không hợp lệ giữa hai loại không tương thích?) Hoặc nó là một vấn đề ghi đè lớp?

Trả lời

23

Hãy xem định nghĩa sau. Thông báo Foo được hiển thị cho bất cứ ai, và phương pháp công cộng của nó GetBar cũng được hiển thị cho bất cứ ai có thể nhìn thấy Foo:

public class Foo 
{ 
    public Bar GetBar() { return new Bar(); } 
} 

Dưới đây là định nghĩa của Bar:

internal class Bar {} 

thông báo Barnội bộ để lắp ráp, trong khi Foo hiển thị cho tất cả. Foo không thể phơi bày Bar với thế giới bên ngoài, do đó trình biên dịch ném ngoại lệ này.

Một ví dụ khác sẽ là:

public class Foo 
{ 
    public Foo.Bar GetBar() { return new Bar(); } 
    private class Bar {} 
} 

Bar là một lớp riêng của Foo và chỉ có thể được hiển thị với các trường hợp Foo. Foo không thể phơi bày loại này với thế giới bên ngoài, do đó trình biên dịch ném cùng một ngoại lệ.


Ví dụ về refactoring:

  1. Hãy loại ẩn công cộng

    public class Bar {} 
    public class Foo { public class Bar {} } 
    
  2. Encapsulation

    public class BarEncapsulator 
    { 
        private Bar _bar; 
        internal BarEncapsulator(Bar myBar) { _bar = myBar; } 
        public string BarString { get { return _bar.MyString; } } 
    } 
    
  3. Hide tất cả mọi thứ

    internal class Bar {} 
    internal class Foo { public class Bar {} } 
    
  4. Refactor nó đi

    public class BarEncapsulator 
    { 
        private string _barString; 
        public string BarString { get { return _barString; } } 
    } 
    
+0

+1 Ví dụ hay. –

+0

Oh ok, bây giờ tôi nhận được những gì lỗi là tất cả về. Bây giờ rất nhiều mã này trông giống như nó được tạo ra bởi trình soạn thảo Visual Studio WYSIWYG, làm thế nào tôi sẽ đi về sửa chữa đó? – tearman

+0

Bất cứ điều gì bạn đang cố gắng làm trong truy cập công cộng đó có thể là sai. Bạn cần phải cấu trúc lại UITitleSettings thành 1), đóng gói nó thành kiểu public 3) tạo mọi thứ bên trong hoặc 4) UITitleSettings refactor ra khỏi hình và hiển thị các phần riêng của nó như các thuộc tính cung cấp nguyên thủy (các kiểu hệ thống tiêu chuẩn) . Rất nhiều cách để làm điều đó; chỉ cần chọn một trong đó không phải là cách bạn đang làm nó ngay bây giờ. – Will

0

Xóa "đường dẫn lớp" sẽ không làm gì cả. Bạn chỉ đang làm cho mã của bạn ít tiết hơn ... Kiểm tra định nghĩa của Properties.UITitleSettings. Nó sẽ là riêng tư hoặc được bảo vệ, v.v.

+0

Tôi chỉ cần loại bỏ nó vì những lý do riêng tư hơn gỡ lỗi lý do (chỉ muốn làm rõ rằng bình thường của nó chứa). Định nghĩa thuộc tính.UITitleSettings được đóng kín một phần – tearman

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