Anggota '<method>' tidak dapat diakses dengan referensi contoh

195

Saya masuk ke C # dan saya mengalami masalah ini:

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;
            }
        }
     }
 }

Saya memiliki kode ini di UserControl:

using MyDataLayer.Section1;

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

Semuanya berfungsi dengan baik, kecuali ketika saya pergi ke akses Property1. IntelliSense hanya memberi saya " , , dan " sebagai pilihan. Ketika saya mengarahkan mouse ke atas , Visual Studio memberi saya penjelasan ini:EqualsGetHashCodeGetTypeToStringoItem.Property1

MemberMyDataLayer.Section1.MyClass.MyItem.Property1.getcannot be accessed with an instance reference, qualify it with a type name instead

Saya tidak yakin apa artinya ini, saya melakukan beberapa pencarian di Google tetapi tidak dapat mengetahuinya.

Anders
sumber

Jawaban:

283

Dalam C #, tidak seperti VB.NET dan Java, Anda tidak dapat mengakses staticanggota dengan sintaks instance. Kamu seharusnya melakukan:

MyClass.MyItem.Property1

untuk merujuk ke properti itu atau menghapus staticpengubah dari Property1(yang mungkin ingin Anda lakukan). Untuk ide konseptual tentang apa staticitu, lihat jawaban saya yang lain .

Mehrdad Afshari
sumber
45

Anda hanya dapat mengakses anggota statis menggunakan nama tipe.

Karena itu, Anda harus menulis,

MyClass.MyItem.Property1

Atau (ini mungkin yang perlu Anda lakukan) membuat Property1properti instance dengan menghapus statickata kunci dari definisi.

Properti statis dibagikan di antara semua instance dari kelas mereka, sehingga mereka hanya memiliki satu nilai. Cara itu didefinisikan sekarang, tidak ada gunanya membuat instance dari kelas MyItem Anda.

Slaks
sumber
Ini "Atau (ini mungkin yang perlu Anda lakukan) menjadikan Property1 sebuah properti instan dengan menghapus kata kunci statis dari definisinya." adalah kunci kesuksesan !! Terima kasih
tim687
29

Saya memiliki masalah yang sama - meskipun beberapa tahun kemudian, beberapa mungkin menemukan beberapa petunjuk bermanfaat:

Jangan gunakan 'statis' secara serampangan!

Memahami apa yang 'statis' menyiratkan dalam hal run-time dan kompilasi semantik waktu (perilaku) dan sintaksis.

  • Entitas statis akan dibangun secara otomatis beberapa waktu sebelum
    digunakan pertama kali.

  • Entitas statis memiliki satu lokasi penyimpanan yang dialokasikan, dan yang
    dibagikan oleh semua orang yang mengakses entitas itu.

  • Entitas statis hanya dapat diakses melalui nama tipenya, bukan
    melalui instance dari tipe itu.

  • Metode statis tidak memiliki argumen 'ini' tersirat, seperti halnya metode contoh. (Dan karena itu metode statis memiliki
    overhead eksekusi lebih sedikit - satu alasan untuk menggunakannya.)

  • Pikirkan tentang keamanan utas saat menggunakan entitas statis.

Beberapa detail tentang statis di MSDN:

CarlH
sumber
4

Tidak perlu menggunakan statis dalam hal ini sebagaimana dijelaskan secara menyeluruh. Anda mungkin juga menginisialisasi properti Anda tanpa GetItem()metode, contoh keduanya di bawah ini:

namespace MyNamespace
{
    using System;

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

Mengkonsumsi:

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;
    }
}       
Alan
sumber
3

tidak dapat diakses dengan referensi contoh

Ini berarti Anda memanggil metode STATIC dan mengirimkannya sebagai instance. Solusi termudah adalah menghapus Static, mis:

public static kekosongan ExportToExcel (data IEnumerable, tali SHEETNAME) {

Jeremy Thompson
sumber
2

Saya tahu ini adalah utas lama, tetapi saya hanya menghabiskan 3 jam untuk mencari tahu apa masalah saya. Saya biasanya tahu apa arti kesalahan ini, tetapi Anda bisa mengalami ini dengan cara yang lebih halus juga. Masalah saya adalah kelas klien saya (yang memanggil metode statis dari kelas instan) memiliki properti dengan tipe yang berbeda tetapi dinamai sama dengan metode statis. Kesalahan yang dilaporkan oleh kompiler sama dengan yang dilaporkan di sini, tetapi masalahnya pada dasarnya adalah nama tabrakan.

Untuk siapa pun yang mendapatkan kesalahan ini dan tidak ada yang di atas yang membantu, coba kualifikasi sepenuhnya kelas instance Anda dengan nama namespace. .. () agar kompiler dapat melihat nama persis yang Anda maksud.

DJ
sumber
Saya menemukan ini sangat membantu. Saya memiliki tabrakan nama dan bahkan tidak mengetahuinya. Segera setelah saya menambahkan namespace sebelum pemanggilan metode saya, masalah terselesaikan.
Maks
1

Periksa apakah kode Anda mengandung namespace yang sebagian besar cocok dengan nama kelas statis Anda.

Dengan kelas Bar statis , didefinisikan pada namespace Foo , menerapkan metode Jump atau properti, kemungkinan Anda menerima kesalahan kompilator karena ada juga namespace lain yang berakhir pada Bar . Yap, fishi stuff ;-)

Jika demikian, itu berarti Anda menggunakan Bar Menggunakan; dan panggilan Bar.Jump () , oleh karena itu salah satu solusi berikut harus sesuai dengan kebutuhan Anda:

  • Sepenuhnya memenuhi syarat nama kelas statis dengan sesuai ruang nama, yang menghasilkan deklarasi Foo.Bar.Jump () . Anda juga perlu menghapus Bilah Menggunakan; pernyataan
  • Mengubah nama namespace Bar dengan nama diffente.

Dalam kasus saya, kesalahan kompilasi setelah mengikuti terjadi pada EF proyek repositori ( Entity Framework ) pada panggilan Database.SetInitializer () :

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

Kesalahan ini muncul ketika saya menambahkan MyProject.ORM. Database namespace, yang sufix ( Database ), seperti yang Anda perhatikan, cocok dengannama kelas .SetInitializer Database .

Dalam hal ini, karena saya tidak punya kendali pada EF kelas statis Database dan saya juga ingin mempertahankan namespace kustom saya, saya memutuskan untuk sepenuhnya memenuhi syarat kelas statis Database EF dengan namepace System.Data.Entity , yang menghasilkan penggunaan perintah berikut, yang kompilasi berhasil:

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

Semoga ini bisa membantu

Julio Nobre
sumber
1

Ini menyebabkan kesalahan:

MyClass aCoolObj = new MyClass();
aCoolObj.MyCoolStaticMethod();

Ini adalah perbaikannya:

MyClass.MyCoolStaticMethod();

Penjelasan:

Anda tidak dapat memanggil metode statis dari instance objek. Inti dari metode statis adalah untuk tidak terikat pada instance dari objek, tetapi sebaliknya untuk bertahan melalui semua instance dari objek itu, dan / atau untuk digunakan tanpa instance dari objek tersebut.

Andrew
sumber
0
YourClassName.YourStaticFieldName

Untuk bidang statis Anda akan terlihat seperti:

public class StaticExample 
{
   public static double Pi = 3.14;
}

Dari kelas lain, Anda dapat mengakses bidang staic sebagai berikut:

    class Program
    {
     static void Main(string[] args)
     {
         double radius = 6;
         double areaOfCircle = 0;

         areaOfCircle = StaticExample.Pi * radius * radius;
         Console.WriteLine("Area = "+areaOfCircle);

         Console.ReadKey();
     }
  }
Hedego
sumber
Mungkin Anda bisa menerjemahkan solusi Anda ke dalam contoh pertanyaan dan menjelaskan sedikit tentang cara kerja bidang statis berkenaan dengan definisi dan instance kelas?
noetix
Terima kasih atas komentar Anda, bagaimana kalau sekarang @Alex?
Hedego