Lid ‘<methode>’ kan niet worden geopend met een instantiereferentie

Ik begin met C# en heb dit probleem:

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

Ik heb deze code op een UserControl:

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

Alles werkt prima, behalve wanneer ik naar Property1ga. De intellisense geeft me alleen “Equals, GetHashCode, GetTypeen ToString” als opties. Als ik met de muis over de oItem.Property1ga, geeft Visual Studio me deze uitleg:

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

Ik weet niet zeker wat dit betekent, ik heb wat gegoogled maar kon het niet achterhalen.


Antwoord 1, autoriteit 100%

In C# heb je, in tegenstelling tot VB.NET en Java, geen toegang tot static-leden met instantiesyntaxis. Je moet doen:

MyClass.MyItem.Property1

om naar die eigenschap te verwijzen of de static-modifier uit Property1te verwijderen (wat je waarschijnlijk wilt doen). Voor een conceptueel idee over wat staticis, zie mijn andere antwoord.


Antwoord 2, autoriteit 15%

Je hebt alleen toegang tot statische leden met de naam van het type.

Daarom moet je ofwel schrijven,

MyClass.MyItem.Property1

Of (dit is waarschijnlijk wat u moet doen) van Property1een instantie-eigenschap maken door het sleutelwoord staticuit de definitie te verwijderen.

Statische eigenschappen worden gedeeld tussen alle instanties van hun klasse, zodat ze maar één waarde hebben. Zoals het nu is gedefinieerd, heeft het geen zin om instanties van uw MyItem-klasse te maken.


Antwoord 3, autoriteit 10%

Ik had hetzelfde probleem – hoewel een paar jaar later sommigen misschien een paar tips nuttig vinden:

Gebruik ‘statisch’ niet onnodig!

Begrijp wat ‘statisch’ betekent in termen van semantiek (gedrag) en syntaxis van zowel runtime als compile-time.

  • Een statische entiteit wordt enige tijd eerder automatisch geconstrueerd
    het eerste gebruik.

  • Aan een statische entiteit is één opslaglocatie toegewezen, en dat is
    gedeeld door iedereen die toegang heeft tot die entiteit.

  • Een statische entiteit is alleen toegankelijk via de typenaam, niet
    via een instantie van dat type.

  • Een statische methode heeft geen impliciet ‘this’-argument, net als een
    instantie methode. (En daarom heeft een statische methode minder uitvoering
    overhead – een reden om ze te gebruiken.)

  • Denk aan de veiligheid van threads bij het gebruik van statische entiteiten.

Enkele details over statische elektriciteit in MSDN:


Antwoord 4, autoriteit 2%

Het is in dit geval niet nodig om static te gebruiken, zoals grondig wordt uitgelegd. U kunt uw property net zo goed initialiseren zonder de GetItem()-methode, voorbeeld van beide hieronder:

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

Consumerend:

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

Antwoord 5, autoriteit 2%

Dit veroorzaakt de fout:

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

Dit is de oplossing:

MyClass.MyCoolStaticMethod();

Uitleg:

Je kunt geen statische methode aanroepen vanuit een instantie van een object. Het hele punt van statische methoden is om niet gebonden te zijn aan instanties van objecten, maar in plaats daarvan door te gaan met alle instanties van dat object, en/of te worden gebruikt zonder enige instantie van het object.


Antwoord 6

niet toegankelijk met een instantieverwijzing

Het betekent dat je een STATIC-methode aanroept en deze een instantie doorgeeft. De eenvoudigste oplossing is om Static te verwijderen, bijvoorbeeld:

public staticvoid ExportToExcel(IEnumerable data, string sheetName)
{


Antwoord 7

Ik ben hier aan het googelen naar C#-compilerfout CS0176, via (dubbele) vraag Statisch probleem met verwijzing naar lidinstantie.

In mijn geval deed de fout zich voor omdat ik een statische methode en een extensiemethode met dezelfde naam had. Zie daarvoor Statische methode en extensiemethode met dezelfde naam.

[Misschien had dit een opmerking moeten zijn. Sorry dat ik nog niet genoeg reputatie heb.]


Antwoord 8

Ik weet dat dit een oude thread is, maar ik heb net 3 uur besteed om erachter te komen wat mijn probleem was. Ik weet normaal gesproken wat deze fout betekent, maar je kunt dit ook op een subtielere manier tegenkomen. Mijn probleem was dat mijn clientklasse (degene die een statische methode aanroept vanuit een instantieklasse) een eigenschap van een ander type had, maar dezelfde naam had als de statische methode. De fout die door de compiler werd gemeld, was dezelfde als hier gemeld, maar het probleem was in feite een naambotsing.

Voor iedereen die deze fout krijgt en geen van bovenstaande helpt, probeer je instantieklasse volledig te kwalificeren met de naamruimtenaam. ..() zodat de compiler de exacte naam kan zien die u bedoelt.


Antwoord 9

Controleer of uw code een naamruimte bevat die het meest rechts overeenkomt met uw statische klassenaam.

Gezien de statische klasse Bar, gedefinieerd op naamruimte Foo, waarbij een methode Jumpof een eigenschap wordt geïmplementeerd, is de kans groot dat u een compiler ontvangt fout omdat er ook een andere naamruimte is die eindigt op Bar. Ja, visdingen 😉

Als dat zo is, betekent dit dat u een Using Bar;en een Bar.Jump()-aanroep gebruikt, daarom zou een van de volgende oplossingen aan uw behoeften moeten voldoen:

  • Kwalificeer de naam van de statische klasse volledig met de bijbehorende naamsnelheid, wat resulteert in een Foo.Bar.Jump()-verklaring. U moet ook de instructie Using Bar;verwijderen
  • Naamruimte Barhernoemen met een andere naam.

In mijn geval trad de belachelijke compilerfout op in een EF(Entity Framework) repositoryproject op een Database.SetInitializer()-aanroep :

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

Deze fout deed zich voor toen ik een MyProject.ORM.Databasenaamruimte toevoegde, met als achtervoegsel (Database) , zoals je misschien hebt opgemerkt, komt overeen met de klassenaam Database.SetInitializer.

Omdat ik geen controle heb over de statische klasse Databasevan EF en ik ook mijn aangepaste naamruimte wil behouden, heb ik besloten om de statische klasse van de EF-database volledig te kwalificeren met zijn namepace Systeem. Data.Entity, wat resulteerde in het gebruik van de volgende opdracht, welke compilatie geslaagd is:

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

Hopelijk helpt het


Antwoord 10

YourClassName.YourStaticFieldName

Want uw statische veld zou er als volgt uitzien:

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

Vanuit een andere klas heb je als volgt toegang tot het statische veld:

   class Program
    {
     static void Main(string[] args)
     {
         double radius = 6;
         double areaOfCircle = 0;
         areaOfCircle = StaticExample.Pi * radius * radius;
         Console.WriteLine("Area = "+areaOfCircle);
         Console.ReadKey();
     }
  }

Other episodes