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:Equals
GetHashCode
GetType
ToString
oItem.Property1
Member
MyDataLayer.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źć.
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:
źródło
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:Trawiący:
źródło
Oznacza to, że wywołujesz metodę STATIC i przekazujesz jej instancję. Najłatwiejszym rozwiązaniem jest usunięcie Statycznego, np .:
public
staticvoid ExportToExcel (IEnumerable data, string sheetName) {źródło
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.
źródło
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 moim przypadku wystąpił błąd kompilatora śledzenia w projekcie repozytorium EF ( Entity Framework ) w wywołaniu Database.SetInitializer () :
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ę:
Mam nadzieję, że to pomoże
źródło
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.]
źródło
To powoduje błąd:
To jest poprawka:
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.
źródło
Twoje pole statyczne wyglądałoby następująco:
Z innej klasy możesz uzyskać dostęp do pola statycznego w następujący sposób:
źródło