web-dev-qa-db-fra.com

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

J'entre dans 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 lorsque je vais accéder à Property1. L'intellisense ne me donne que "Equals, GetHashCode, GetType et ToString" en tant qu'options. Lorsque je passe la souris sur le oItem.Property1, Visual Studio me donne cette explication:

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

Je ne suis pas sûr de ce que cela signifie, j'ai fait quelques recherches sur Google mais je n'ai pas été capable de le comprendre.

171
Anders

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

MyClass.MyItem.Property1

faire référence à cette propriété ou supprimer le modificateur static de Property1 (ce que vous voudrez probablement faire). Pour une idée conceptuelle de ce que static est, voir mon autre réponse .

248
Mehrdad Afshari

Vous pouvez uniquement accéder aux membres statiques en utilisant le nom du type.

Par conséquent, vous devez écrire,

MyClass.MyItem.Property1

Ou (c'est probablement ce que vous devez faire), faites de Property1 une propriété d'instance en supprimant le mot clé static 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. Dans sa définition actuelle, il est inutile de créer une instance de votre classe MyItem.

39
SLaks

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

Ne pas utiliser "statique" gratuitement!

Comprenez ce que ‘statique’ implique en termes de sémantique (comportement) et de syntaxe lors de la compilation et de la compilation.

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

  • Une entité statique a un emplacement de stockage alloué, c'est-à-dire
    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 ‘this’, contrairement à une méthode d’instance. (Et donc une méthode statique a moins d'exécution
    frais généraux - une raison de les utiliser.)

  • Pensez à la sécurité des threads lors de l'utilisation d'entités statiques.

Quelques détails sur les statiques dans MSDN:

26
CarlH

Pas besoin d'utiliser statique dans ce cas, comme expliqué en détail. Vous pourriez aussi bien initialiser votre propriété sans la méthode GetItem(), exemple 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;
    }
}       
4
Alan

ne peut pas être consulté avec une référence d'instance

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

publique statique void ExportToExcel (données IEnumerable, string sheetName) {

3
Jeremy Thompson

Je suis arrivé ici à googler pour l'erreur de compilateur C # CS0176, via (duplicate) question problème de référence d'instance de membre statique .

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

[Peut-être que cela aurait dû être un commentaire. Désolé que je n'ai pas encore assez de réputation.]

1
Pablo H

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 habituellement ce que cette erreur signifie, mais vous pouvez également la découvrir de manière plus subtile. Mon problème était que ma classe client (celle appelant une méthode statique à partir d'une classe d'instance) avait une propriété d'un type différent mais portant le même nom que la méthode statique. L'erreur signalée par le compilateur était la même que celle signalée ici, mais le problème était essentiellement une collision de noms.

Si vous rencontrez cette erreur et que rien de ce qui précède n’aide, essayez de qualifier complètement votre classe d’instance avec le nom de l’espace de nom. .. () afin que le compilateur puisse voir le nom exact que vous voulez dire.

1
D J

Vérifiez si votre code contient un espace de noms dont la partie la plus à droite correspond à votre nom de classe statique.

Étant donné la classe statique Bar, définie sur un espace de noms Foo, implémentant une méthode Jump ou une propriété, il y a des chances que vous receviez une erreur du compilateur car il y a est aussi un autre espace de noms se terminant par Bar. Oui, des trucs de poisson ;-)

Si tel est le cas, cela signifie que vous utilisez un appel sing Bar; et un Bar.Jump (), l'une des solutions suivantes doit donc répondre à vos besoins:

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

Dans mon cas, l’erreur suivante du compilateur s’est produite sur un projet de référentiel EF (--- (Entity Framework) sur un 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 a surgi lorsque j’ai ajouté un MyProject.ORM. Base de données namespace, quel sufixe ( Base de données ), comme vous avez pu le constater, correspond à Base de données . SetInitializer nom de la classe.

En cela, étant donné que je n'ai aucun contrôle sur la classe statique base de données d'EF et que je souhaite également conserver mon espace de noms personnalisé, j'ai décidé de qualifier pleinement la classe statique de base de données d'EF avec son espace de nom System.Data. Entity, résultant de l'utilisation de la commande suivante, la compilation a réussi:

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

J'espère que ça aide

1
Julio Nobre
YourClassName.YourStaticFieldName

Pour votre champ statique ressemblerait à ceci:

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

A partir d'une autre classe, vous pouvez accéder au champ staic 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();
     }
  }
0
Hedego

Cela provoque l'erreur:

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

C'est le correctif:

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 est de ne pas être lié à des occurrences d'objets, mais de persister dans toutes les occurrences de cet objet et/ou d'être utilisé sans aucune occurrence de l'objet.

0
Andrew