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źć.

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ź .


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.


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:


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

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) {


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.


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



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.


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

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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.