'<method>' üyesine örnek başvurusu ile erişilemiyor


195

C # alıyorum ve bu sorunu yaşıyorum:

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

Bir UserControl bu kodu var:

using MyDataLayer.Section1;

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

Erişime gitmem dışında her şey yolunda gidiyor Property1. Intellisense sadece bana "verir Equals, GetHashCode, GetType, ve ToString" seçenekleri olarak. Fareyle üzerine geldiğimde oItem.Property1, Visual Studio bana şu açıklamayı yapar:

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

Bunun ne anlama geldiğinden emin değilim, biraz googling yaptım ama anlayamadım.

Yanıtlar:


283

C # 'da, VB.NET ve Java'nın aksine, staticörnek sözdizimi olan üyelere erişemezsiniz . Yapmalısın:

MyClass.MyItem.Property1

bu özelliğe başvurmak veya staticdeğiştiriciyi kaldırmak Property1(muhtemelen yapmak istediğiniz şeydir). Ne staticolduğu hakkında kavramsal bir fikir için diğer cevabıma bakın .


45

Statik üyelere yalnızca türün adını kullanarak erişebilirsiniz.

Bu nedenle, ya yazmanız gerekir,

MyClass.MyItem.Property1

Veya (bu muhtemelen yapmanız gereken şeydir) anahtar kelimeyi tanımından Property1kaldırarak bir örnek özelliği oluşturun static.

Statik özellikler, sınıflarının tüm örnekleri arasında paylaşılır, böylece yalnızca bir değere sahip olurlar. Şimdi tanımlandığı şekilde, MyItem sınıfınızın herhangi bir örneğini oluşturmanın bir anlamı yoktur.


Bu "Veya (muhtemelen yapmanız gereken şey budur), static anahtar sözcüğünü tanımından kaldırarak Property1'i bir örnek özelliği haline getirir." başarının anahtarıdır !! Teşekkürler
tim687

29

Aynı sorunu yaşadım - birkaç yıl sonra, bazıları birkaç işaretçi bulabilir:

'Statik' iratla kullanmayın!

'Statik' ifadesinin hem çalışma zamanı hem de derleme zamanı semantiği (davranış) ve sözdizimi açısından ne anlama geldiğini anlayın.

  • Statik bir varlık
    , ilk kullanımından bir süre önce otomatik olarak oluşturulur .

  • Statik bir varlığın ayrılmış bir depolama yeri vardır ve
    bu varlık o varlığa erişen herkes tarafından paylaşılır.

  • Statik bir varlığa yalnızca tür adıyla erişilebilir, bu türün
    bir örneği üzerinden erişilemez .

  • Statik bir yöntem, örnek yöntemi gibi örtük bir 'bu' argüman içermez. (Ve bu nedenle, statik bir yöntem daha az yürütme
    yüküne sahiptir - bunları kullanmanın bir nedeni.)

  • Statik objeleri kullanırken iplik güvenliğini düşünün.

MSDN'de statik hakkında bazı ayrıntılar:


4

Bu durumda iyice açıklandığı gibi statik kullanmaya gerek yoktur. Mülkünüzü GetItem()yöntem olmadan da başlatabilirsiniz, her ikisine de örnek:

namespace MyNamespace
{
    using System;

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

tüketmek:

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

3

örnek başvurusu ile erişilemez

Bu, STATIC yöntemini çağırdığınız ve bir örnek ilettiğiniz anlamına gelir. En kolay çözüm Static'i kaldırmaktır, örneğin:

public static void ExportToExcel (IEnumerable veri, dize sayfasıAdı) {


2

Bu eski bir iş parçacığı olduğunu biliyorum, ama sadece sorunumun ne olduğunu anlamaya çalışırken 3 saat geçirdim. Normalde bu hatanın ne anlama geldiğini biliyorum, ama buna daha ince bir şekilde de rastlayabilirsiniz. Sorunum, istemci sınıfım (bir örnek sınıfından statik yöntem çağıran) farklı türde bir özelliğe sahipti ancak statik yöntemle aynı adlı bir özellikti. Derleyici tarafından bildirilen hata, burada bildirilenle aynıdır, ancak sorun temelde ad çakışmasıydı.

Bu hatayı alan herkes ve yukarıdakilerin hiçbiri yardımcı olmazsa, örnek sınıfınızı ad alanı adıyla tam olarak nitelemeyi deneyin. .. () böylece derleyici tam olarak ne demek istediğini görebilir.


Bunu yararlı buldum. Bir isim çarpışması yaşadım ve bilmiyordum bile. Yöntem alanını çağırmadan önce ad alanını ekler eklemez sorun çözüldü.
Maksimum

1

Kodunuzun en sağdaki bölümün statik sınıf adınızla eşleştiğini kontrol edin.

Foo ad alanında tanımlanan statik bir Bar sınıfı göz önüne alındığında, bir yöntem Jump veya özellik uygulandığında , Bar ile biten başka bir ad alanı da olduğundan derleyici hatası alıyorsunuzdur . Evet, fishi şeyler ;-)

Eğer öyleyse, Kullanma Çubuğunu kullanmanız anlamına gelir ; ve bir Bar.Jump () çağrısı, bu nedenle aşağıdaki çözümlerden biri ihtiyaçlarınıza uygun olmalıdır:

  • Statik sınıf adını, Foo.Bar.Jump () bildirimi ile sonuçlanan ad plakasına göre tam olarak nitelendirin . Using Bar'ı da kaldırmanız gerekir ; Beyan
  • Ad alanı Çubuğunu farklı bir adla yeniden adlandırın .

Benim durumumda, bir Database.SetInitializer () çağrısındaki EF ( Entity Framework ) veri havuzu projesinde aşağıdaki derleyici hatası oluştu :

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

Bu hata, bir MyProject.ORM eklediğimde uyandırıyor . Sufix'in ( Database ) fark ettiğiniz gibi Database ad alanı Database .SetInitializer sınıf adıyla eşleşir .

Burada, EF'in veritabanı statik sınıfı üzerinde hiçbir kontrole sahip olmadığım ve özel ad alanımı da korumak istediğim için, EF'in Veritabanı statik sınıfını , aşağıdaki komutu kullanarak sonuçlanan System.Data.Entity adıyla tamamen nitelendirmeye karar verdim. derleme başarılı:

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

Umarım yardımcı olur



1

Bu hataya neden olur:

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

Bu düzeltme:

MyClass.MyCoolStaticMethod();

Açıklama:

Bir nesnenin örneğinden statik bir yöntem çağıramazsınız. Statik yöntemlerin bütün amacı, nesnelerin örneklerine bağlı olmak değil, bunun yerine o nesnenin tüm örnekleri boyunca devam etmek ve / veya nesnenin herhangi bir örneği olmadan kullanılmaktır.


0
YourClassName.YourStaticFieldName

Statik alanınız şöyle görünecektir:

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

Başka bir sınıftan, statik alana aşağıdaki gibi erişebilirsiniz:

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

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

         Console.ReadKey();
     }
  }

Belki de çözümünüzü sorunun örneğine çevirebilir ve statik alanların sınıf tanımları ve örnekleri ile ilgili nasıl çalıştığı hakkında biraz açıklayabilirsiniz?
noetix

Yorumunuz için teşekkür ederim, şimdi nasıl @Alex?
Hedego
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.