Le membre '<method>' n'est pas accessible avec une référence d'instance

195

J'entre en C # et j'ai ce problème:

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

J'ai ce code sur un UserControl:

using MyDataLayer.Section1;

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

Tout fonctionne bien, sauf quand je vais accéder Property1. Le IntelliSense ne me donne « , et » en option. Lorsque je passe la souris sur , Visual Studio me donne cette explication:EqualsGetHashCodeGetTypeToStringoItem.Property1

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

Je ne sais pas ce que cela signifie, j'ai fait quelques recherches sur Google mais je n'ai pas pu le comprendre.

Anders
la source

Réponses:

283

En C #, contrairement à VB.NET et Java, vous ne pouvez pas accéder aux staticmembres avec une syntaxe d'instance. Tu devrais faire:

MyClass.MyItem.Property1

pour faire référence à cette propriété ou supprimer le staticmodificateur de Property1(ce que vous voulez probablement faire). Pour une idée conceptuelle de ce qui staticest, voir mon autre réponse .

Mehrdad Afshari
la source
45

Vous ne pouvez accéder qu'aux membres statiques en utilisant le nom du type.

Par conséquent, vous devez soit écrire,

MyClass.MyItem.Property1

Ou (c'est probablement ce que vous devez faire) créez Property1une propriété d'instance en supprimant le staticmot - clé de sa définition.

Les propriétés statiques sont partagées entre toutes les instances de leur classe, de sorte qu'elles n'ont qu'une seule valeur. De la façon dont il est défini maintenant, il est inutile de créer des instances de votre classe MyItem.

SLaks
la source
Ceci "Ou (c'est probablement ce que vous devez faire) faire de Property1 une propriété d'occurrence en supprimant le mot-clé statique de sa définition." est la clé du succès !! Merci
tim687
29

J'ai eu le même problème - bien que quelques années plus tard, certains puissent trouver quelques conseils utiles:

N'utilisez pas «statique» gratuitement!

Comprendre ce que «statique» implique en termes de sémantique (comportement) et de syntaxe au moment de l'exécution et de la compilation.

  • Une entité statique sera automatiquement construite quelque temps avant
    sa première utilisation.

  • Une entité statique a un emplacement de stockage alloué, qui est
    partagé par tous ceux qui accèdent à cette entité.

  • Une entité statique est uniquement accessible via son nom de type, et non
    via une instance de ce type.

  • Une méthode statique n'a pas d'argument implicite «ceci», tout comme une méthode d'instance. (Et donc une méthode statique a moins de temps d'exécution
    - une raison de les utiliser.)

  • Pensez à la sécurité des threads lorsque vous utilisez des entités statiques.

Quelques détails sur l'électricité statique dans MSDN:

CarlH
la source
4

Pas besoin d'utiliser de l'électricité statique dans ce cas comme expliqué en détail. Vous pourriez aussi bien initialiser votre propriété sans GetItem()méthode, exemple des deux ci-dessous:

namespace MyNamespace
{
    using System;

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

Consommant:

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
la source
3

n'est pas accessible avec une référence d'instance

Cela signifie que vous appelez une méthode STATIC et lui passez une instance. La solution la plus simple consiste à supprimer Static, par exemple:

public static void ExportToExcel (données IEnumerable, chaîne sheetName) {

Jeremy Thompson
la source
2

Je sais que c'est un vieux fil, mais je viens de passer 3 heures à essayer de comprendre quel était mon problème. Je sais d'ordinaire ce que signifie cette erreur, mais vous pouvez également rencontrer cela de manière plus subtile. Mon problème était que ma classe client (celle qui appelait une méthode statique à partir d'une classe d'instance) avait une propriété d'un type différent mais nommée de la même manière que la méthode statique. L'erreur signalée par le compilateur était la même que celle rapportée ici, mais le problème était essentiellement une collision de noms.

Pour toute autre personne obtenant cette erreur et aucune des réponses ci-dessus, essayez de qualifier entièrement votre classe d'instance avec le nom de l'espace de noms. .. () pour que le compilateur puisse voir le nom exact que vous voulez dire.

DJ
la source
J'ai trouvé cela utile. J'ai eu une collision de noms et je ne le savais même pas. Dès que j'ai ajouté l'espace de noms avant mon appel de méthode, le problème a été résolu.
Max
1

Vérifiez si votre code contient un espace de noms qui correspond le mieux à votre nom de classe statique.

Étant donné la classe Bar statique , définie sur l'espace de noms Foo , implémentant une méthode Jump ou une propriété, il est probable que vous receviez une erreur de compilation car il existe également un autre espace de noms se terminant sur Bar . Ouais, des trucs de fishi ;-)

Si c'est le cas, cela signifie que vous utilisez une barre d'utilisation; et un appel Bar.Jump () , par conséquent, l'une des solutions suivantes devrait répondre à vos besoins:

  • Qualifiez complètement le nom de classe statique avec l'espace de nom correspondant, qui résulte de la déclaration Foo.Bar.Jump () . Vous devrez également supprimer Using Bar; déclaration
  • Renommez la barre d' espace de noms par un nom différent.

Dans mon cas, l'erreur de compilation suivante s'est produite sur un projet de référentiel EF ( Entity Framework ) sur un appel Database.SetInitializer () :

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

Cette erreur se produit lorsque j'ai ajouté un MyProject.ORM. Espace de noms de base de données , dont le suffixe ( base de données ), comme vous l'avez peut-être remarqué, correspond au nom de la classe Database .SetInitializer .

En cela, comme je n'ai aucun contrôle sur la classe statique de base de données d'EF et que je voudrais également conserver mon espace de noms personnalisé, j'ai décidé de qualifier complètement la classe statique de base de données d'EF avec son espace de noms System.Data.Entity , ce qui a résulté en utilisant la commande suivante, qui la compilation réussit:

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

J'espère que ça aide

Julio Nobre
la source
1

Je suis arrivé ici sur Google pour rechercher l'erreur de compilateur C # CS0176, via la question (en double) Problème de référence d'instance de membre statique .

Dans mon cas, l'erreur s'est produite car j'avais une méthode statique et une méthode d'extension du même nom. Pour cela, voir Méthode statique et méthode d'extension du même nom .

[Cela aurait pu être un commentaire. Désolé de ne pas avoir encore assez de réputation.]

Pablo H
la source
1

Cela provoque l'erreur:

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

C'est la solution:

MyClass.MyCoolStaticMethod();

Explication:

Vous ne pouvez pas appeler une méthode statique à partir d'une instance d'un objet. L'intérêt des méthodes statiques n'est pas d'être lié à des instances d'objets, mais de persister à travers toutes les instances de cet objet et / ou d'être utilisé sans aucune instance de l'objet.

Andrew
la source
0
YourClassName.YourStaticFieldName

Car votre champ statique ressemblerait à:

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

À partir d'une autre classe, vous pouvez accéder au champ staique comme suit:

    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
la source
Peut-être pourriez-vous traduire votre solution dans l'exemple de la question et expliquer un peu comment les champs statiques fonctionnent en ce qui concerne les définitions de classe et les instances?
noetix
Merci pour votre commentaire, et maintenant @Alex?
Hedego