Do elementu <method> nie można uzyskać dostępu za pomocą odwołania do instancji

195

Wchodzę w C # i mam ten problem:

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

Mam ten kod na UserControl:

using MyDataLayer.Section1;

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

Wszystko działa dobrze, z wyjątkiem sytuacji, gdy idę do dostępu Property1. Intellisense daje tylko ja „ , , i ” jako opcji. Po najechaniu myszką Visual Studio podaje mi następujące wyjaśnienie:EqualsGetHashCodeGetTypeToStringoItem.Property1

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

Nie jestem pewien, co to znaczy, trochę googlowałem, ale nie byłem w stanie tego rozgryźć.

Anders
źródło

Odpowiedzi:

283

W języku C #, w przeciwieństwie do VB.NET i Java, nie można uzyskać dostępu do staticczłonków za pomocą składni instancji. Powinieneś zrobić:

MyClass.MyItem.Property1

odwoływać się do tej właściwości lub usuwać staticmodyfikator Property1(co prawdopodobnie chcesz zrobić). Pojęciowy pomysł na to static, co jest, zobacz moją drugą odpowiedź .

Mehrdad Afshari
źródło
45

Dostęp do elementów statycznych można uzyskać tylko przy użyciu nazwy typu.

Dlatego musisz albo napisać,

MyClass.MyItem.Property1

Lub (prawdopodobnie to właśnie musisz zrobić) zrobić Property1właściwość instancji, usuwając staticsłowo kluczowe z definicji.

Właściwości statyczne są wspólne dla wszystkich instancji ich klasy, dzięki czemu mają tylko jedną wartość. Sposób, w jaki jest teraz zdefiniowany, nie ma sensu tworzyć żadnych instancji klasy MyItem.

SLaks
źródło
To „Lub (prawdopodobnie to właśnie musisz zrobić) uczynić Właściwość 1 właściwością instancji poprzez usunięcie statycznego słowa kluczowego z jej definicji”. jest kluczem do sukcesu !! Dzięki
tim687
29

Miałem ten sam problem - chociaż kilka lat później niektórym może się przydać kilka wskazówek:

Nie używaj „statycznego” nieuzasadnionego!

Zrozum, co implikuje „statyczny”, zarówno pod względem semantyki (zachowania) w czasie wykonywania, jak i składni.

  • Istota statyczna zostanie automatycznie skonstruowana na jakiś czas przed
    pierwszym użyciem.

  • Jednostka statyczna ma przydzieloną jedną lokalizację pamięci, która jest
    współdzielona przez wszystkich, którzy uzyskują dostęp do tej jednostki.

  • Dostęp
    do elementu statycznego można uzyskać tylko poprzez jego nazwę typu, a nie przez instancję tego typu.

  • Metoda statyczna nie ma niejawnego argumentu „ten”, podobnie jak metoda instancji. (A zatem metoda statyczna ma mniejszy
    narzut związany z wykonywaniem - jeden powód, aby z nich skorzystać).

  • Pomyśl o bezpieczeństwie wątków podczas używania obiektów statycznych.

Niektóre szczegóły dotyczące statycznego w MSDN:

CarlH
źródło
4

W tym przypadku nie ma potrzeby używania trybu statycznego, jak dokładnie wyjaśniono. Równie dobrze możesz zainicjować swoją właściwość bez GetItem()metody, przykład obu poniżej:

namespace MyNamespace
{
    using System;

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

Trawiący:

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
źródło
3

nie można uzyskać dostępu za pomocą odwołania do instancji

Oznacza to, że wywołujesz metodę STATIC i przekazujesz jej instancję. Najłatwiejszym rozwiązaniem jest usunięcie Statycznego, np .:

public static void ExportToExcel (IEnumerable data, string sheetName) {

Jeremy Thompson
źródło
2

Wiem, że to stary wątek, ale spędziłem 3 godziny, próbując dowiedzieć się, na czym polega mój problem. Zazwyczaj wiem, co oznacza ten błąd, ale możesz napotkać na to również w bardziej subtelny sposób. Mój problem polegał na tym, że moja klasa klienta (ta wywołująca metodę statyczną z klasy instancji) miała właściwość innego typu, ale nazwana tak samo jak metoda statyczna. Błąd zgłoszony przez kompilator był taki sam, jak zgłoszony tutaj, ale problem polegał w zasadzie na kolizji nazw.

Jeśli ktoś otrzyma ten błąd i żadne z powyższych nie pomoże, spróbuj w pełni zakwalifikować klasę instancji za pomocą nazwy przestrzeni nazw. .. (), aby kompilator mógł zobaczyć dokładną nazwę, którą masz na myśli.

DJ
źródło
Uznałem to za pomocne. Miałem kolizję nazwy i nawet o tym nie wiedziałem. Gdy tylko dodałem przestrzeń nazw przed wywołaniem metody, problem został rozwiązany.
Maks.
1

Sprawdź, czy kod zawiera przestrzeń nazw, w której najbardziej odpowiednia część odpowiada nazwie klasy statycznej.

Biorąc pod uwagę statyczną klasę Bar , zdefiniowaną w przestrzeni nazw Foo , implementującą metodę Jump lub właściwość, istnieje prawdopodobieństwo, że pojawia się błąd kompilatora, ponieważ istnieje również inna przestrzeń nazw kończąca się na Bar . Tak, rzeczy rybne ;-)

Jeśli tak, oznacza to, że używasz paska używania; i wywołanie Bar.Jump () , dlatego jedno z poniższych rozwiązań powinno pasować do twoich potrzeb:

  • W pełni kwalifikuj nazwę klasy statycznej z odpowiednią przestrzenią nazw, które wynikają z deklaracji Foo.Bar.Jump () . Będziesz także musiał usunąć za pomocą paska; komunikat
  • Zmiana nazwy przestrzeni nazw Bar przez nazwę diffente.

W moim przypadku wystąpił błąd kompilatora śledzenia w projekcie repozytorium EF ( Entity Framework ) w wywołaniu Database.SetInitializer () :

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

Ten błąd pojawia się, gdy dodałem MyProject.ORM. Przestrzeń nazw bazy danych , której sufiks ( baza danych ), jak można zauważyć, odpowiada nazwie klasy Database .SetInitializer .

Ponieważ nie mam kontroli nad statyczną klasą bazy danych EF i chciałbym również zachować swoją niestandardową przestrzeń nazw, postanowiłem w pełni zakwalifikować klasę statyczną bazy danych EF za pomocą jej przestrzeni nazw System.Data.Entity , co spowodowało użycie następującego polecenia, które kompilacja powiodła się:

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

Mam nadzieję, że to pomoże

Julio Nobre
źródło
1

Mam google w poszukiwaniu błędu kompilatora C # CS0176, poprzez (zduplikowane) pytanie Problem z referencją instancji członka statycznego .

W moim przypadku wystąpił błąd, ponieważ miałem metodę statyczną i metodę rozszerzenia o tej samej nazwie. W tym celu zobacz Metoda statyczna i metoda rozszerzenia o tej samej nazwie .

[Być może powinien to być komentarz. Przepraszam, że nie mam jeszcze wystarczającej reputacji.]

Pablo H.
źródło
1

To powoduje błąd:

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

To jest poprawka:

MyClass.MyCoolStaticMethod();

Wyjaśnienie:

Nie można wywołać metody statycznej z instancji obiektu. Cały sens metod statycznych nie powinien być związany z instancjami obiektów, ale powinien trwać przez wszystkie instancje tego obiektu i / lub być używany bez żadnych instancji obiektu.

Andrzej
źródło
0
YourClassName.YourStaticFieldName

Twoje pole statyczne wyglądałoby następująco:

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

Z innej klasy możesz uzyskać dostęp do pola statycznego w następujący sposób:

    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
źródło
Być może mógłbyś przełożyć swoje rozwiązanie na przykład pytania i wyjaśnić trochę, jak działają pola statyczne w odniesieniu do definicji klas i instancji?
noetix
Dziękuję za komentarz, a może teraz @Alex?
Hedego