2009-07-08 24 views
120

Tôi nhận được vào C# và tôi đang gặp vấn đề này:Member '<method>' không thể được truy cập với một ví dụ tham khảo

namespace MyDataLayer 
{ 
    namespace Section1 
    { 
     public class MyClass 
     { 
      public class MyItem 
      { 
       public static string Property1{ get; set; } 
      } 
      public static MyItem GetItem() 
      { 
       MyItem theItem = new MyItem(); 
       theItem.Property1 = "MyValue"; 
       return theItem; 
      } 
     } 
    } 
} 

tôi có mã này trên một UserControl:

using MyDataLayer.Section1; 

public class MyClass 
{ 
    protected void MyMethod 
    { 
     MyClass.MyItem oItem = new MyClass.MyItem(); 
     oItem = MyClass.GetItem(); 
     someLiteral.Text = oItem.Property1; 
    } 
} 

công trình Tất cả mọi thứ tốt, ngoại trừ khi tôi truy cập Property1. Intellisense chỉ cung cấp cho tôi "Equals, GetHashCode, GetTypeToString" làm tùy chọn. Khi tôi chuột lên oItem.Property1, Visual Studio mang lại cho tôi giải thích này:

Member MyDataLayer.Section1.MyClass.MyItem.Property1.get cannot be accessed with an instance reference, qualify it with a type name instead

Tôi không chắc chắn về những gì này có nghĩa là, tôi đã làm một số googling nhưng không thể tìm ra.

Trả lời

183

Trong C#, không giống như VB.NET và Java, bạn không thể truy cập static thành viên bằng cú pháp mẫu. Bạn nên làm:

MyClass.MyItem.Property1 

để đề cập đến tài sản đó hoặc loại bỏ các modifier static từ Property1 (đó là những gì có thể bạn muốn làm). Để biết ý tưởng khái niệm về những gì static is, see my other answer.

29

Bạn chỉ có thể truy cập các thành viên tĩnh sử dụng tên loại.

Vì vậy, bạn cần phải hoặc viết,

MyClass.MyItem.Property1 

Hoặc (điều này có lẽ là những gì bạn cần làm) làm Property1 một tài sản chẳng hạn bằng cách loại bỏ các từ khóa static từ định nghĩa của nó.

Thuộc tính tĩnh được chia sẻ giữa tất cả các phiên bản của lớp, do đó chúng chỉ có một giá trị. Cách nó được định nghĩa bây giờ, không có điểm trong việc tạo ra bất kỳ trường hợp nào của lớp MyItem của bạn.

+0

này "Hay (điều này có lẽ là những gì bạn cần làm) làm Property1 một tài sản dụ bởi loại bỏ từ khóa tĩnh khỏi định nghĩa của nó. " là chìa khóa thành công !! Cảm ơn – tim687

17

tôi đã cùng một vấn đề - mặc dù một vài năm sau đó, một số có thể tìm thấy một vài gợi ý hữu ích:

Không sử dụng ‘tĩnh’ cách nhưng không!

Hiểu ‘tĩnh’ ngụ ý về cả ngữ nghĩa và cú pháp thời gian chạy và biên dịch.

  • Một thực thể tĩnh sẽ được tự động xây dựng một số thời gian trước khi
    sử dụng đầu tiên của nó.

  • Thực thể tĩnh có một vị trí lưu trữ được phân bổ và đó là
    được tất cả những người truy cập vào thực thể đó chia sẻ.

  • Thực thể tĩnh chỉ có thể được truy cập thông qua tên loại, không phải
    thông qua một phiên bản loại đó.

  • Phương pháp tĩnh không có đối số ngầm định 'này', cũng như phương pháp thể hiện . (Và do đó một phương pháp tĩnh có ít thực thi
    trên không - một lý do để sử dụng chúng.)

  • Hãy suy nghĩ về an toàn luồng khi sử dụng các thực thể tĩnh.

Một số chi tiết về tĩnh trong MSDN:

1

không thể truy cập với một ví dụ tham khảo

Nó có nghĩa là bạn đang gọi một phương thức STATIC và chuyển nó thành một thể hiện. Giải pháp đơn giản nhất là để loại bỏ tĩnh, ví dụ:

công tĩnh trống ExportToExcel (dữ liệu IEnumerable, chuỗi SHEETNAME) {

0

Kiểm tra xem mã của bạn có chứa một namespace mà quyền hầu hết phần phù hợp với tên lớp tĩnh của bạn .

Với một tĩnh Bar lớp, xác định trên namespace Foo, triển khai một phương pháp Chuyển hoặc một tài sản, rất có thể là bạn đang nhận lỗi biên dịch vì đó cũng là một không gian tên kết thúc vào Bar. Yep, fishi stuff ;-)

Nếu đúng như vậy, điều đó có nghĩa là bạn đang sử dụng Thanh sử dụng ;Bar.Jump() cuộc gọi, do đó một trong những giải pháp sau đây cần phù hợp với nhu cầu của bạn:

  • đủ điều kiện đầy đủ tên lớp tĩnh với theo namepace, mà kết quả trên Foo.Bar.Jump() tờ khai. Bạn cũng sẽ cần phải xóa Sử dụng Bar; tuyên bố
  • Đổi tên vùng tên Thanh bằng tên khác.

Trong trường hợp của tôi, lỗi biên dịch foollowing xảy ra trên một EF (Entity Framework) dự án kho lưu trữ trên một Database.SetInitializer() gọi:

Member 'Database.SetInitializer<MyDatabaseContext>(IDatabaseInitializer<MyDatabaseContext>)' cannot be accessed with an instance reference; qualify it with a type name instead MyProject.ORM 

này lỗi khơi dậy khi Tôi đã thêm MyProject.ORM.Cơ sở dữ liệu namespace, mà sufix (Cơ sở dữ liệu), như bạn có thể nhận thấy, phù hợp với Cơ sở dữ liệu .SetInitializer tên lớp.

Trong này, vì tôi không có kiểm soát trên lớp tĩnh Cơ sở dữ liệu EF và tôi cũng muốn giữ gìn không gian tên tùy chỉnh của tôi, tôi quyết định hoàn toàn đủ điều kiện Cơ sở dữ liệu lớp tĩnh EF với nó namepace System.Data.Entity, mà dẫn về cách sử dụng lệnh sau đây, mà biên soạn thành công:

System.Data.Entity.Database.SetInitializer<MyDatabaseContext>(MyMigrationStrategy) 

Hy vọng nó giúp

0

tôi đã ở đây googling cho biên dịch C# lỗi CS0176, thông qua (trùng lặp) câu hỏi Static member instance reference issue.

Trong trường hợp của tôi, lỗi xảy ra do tôi có phương thức tĩnh và phương thức tiện ích có cùng tên. Để làm điều đó, hãy xem Static method and extension method with same name.

[Có thể đây phải là nhận xét. Xin lỗi vì tôi chưa có đủ danh tiếng.]

0

Tôi biết đây là một chủ đề cũ, nhưng tôi đã dành 3 giờ để tìm ra vấn đề của mình. Tôi thường biết những gì lỗi này có nghĩa là, nhưng bạn có thể chạy vào điều này một cách tinh tế hơn là tốt. Vấn đề của tôi là lớp khách hàng của tôi (người gọi một phương thức tĩnh từ một lớp thể hiện) có một thuộc tính của một kiểu khác nhưng được đặt tên giống như phương thức tĩnh. Lỗi được trình biên dịch báo cáo giống như báo cáo ở đây, nhưng vấn đề về cơ bản là xung đột tên.

Đối với bất kỳ ai khác nhận được lỗi này và không có điều nào ở trên hữu ích, hãy thử hoàn thành đủ điều kiện lớp thể hiện của bạn với tên không gian tên. ..() để trình biên dịch có thể thấy chính xác tên bạn muốn nói.

2

Không cần sử dụng tĩnh trong trường hợp này được giải thích kỹ lưỡng. Bạn cũng có thể khởi tạo tài sản của bạn mà không GetItem() phương pháp, ví dụ của cả hai bên dưới:

namespace MyNamespace 
{ 
    using System; 

    public class MyType 
    { 
     public string MyProperty { get; set; } = new string(); 
     public static string MyStatic { get; set; } = "I'm static"; 
    } 
} 

Tiêu thụ:

using MyType; 

public class Somewhere 
{ 
    public void Consuming(){ 

     // through instance of your type 
     var myObject = new MyType(); 
     var alpha = myObject.MyProperty; 

     // through your type 
     var beta = MyType.MyStatic; 
    } 
}  
Các vấn đề liên quan