No se puede acceder al miembro '<método>' con una referencia de instancia


195

Me estoy metiendo en C # y tengo este problema:

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

Tengo este código en un UserControl:

using MyDataLayer.Section1;

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

Todo funciona bien, excepto cuando voy a acceder Property1. El intelisense sólo da a mí " , y " como opciones. Cuando paso el mouse sobre , Visual Studio me da esta explicación:EqualsGetHashCodeGetTypeToStringoItem.Property1

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

No estoy seguro de lo que esto significa, busqué en Google pero no pude resolverlo.

Respuestas:


283

En C #, a diferencia de VB.NET y Java, no puede acceder a staticmiembros con sintaxis de instancia. Deberías hacer:

MyClass.MyItem.Property1

para referirse a esa propiedad o eliminar el staticmodificador Property1(que es lo que probablemente quiera hacer). Para una idea conceptual sobre lo que statices, vea mi otra respuesta .


45

Solo puede acceder a miembros estáticos utilizando el nombre del tipo.

Por lo tanto, necesita escribir,

MyClass.MyItem.Property1

O (esto es probablemente lo que necesita hacer) haga Property1una propiedad de instancia eliminando la staticpalabra clave de su definición.

Las propiedades estáticas se comparten entre todas las instancias de su clase, de modo que solo tienen un valor. De la forma en que se define ahora, no tiene sentido hacer instancias de su clase MyItem.


Esto "O (esto es probablemente lo que necesita hacer) hace que Property1 sea una propiedad de instancia al eliminar la palabra clave estática de su definición". es la clave del exito !! Gracias
tim687

29

Tuve el mismo problema, aunque unos años más tarde, algunos pueden encontrar algunos consejos útiles:

¡No use 'estática' gratuitamente!

Comprenda lo que 'estático' implica en términos de semántica (comportamiento) y sintaxis en tiempo de ejecución y tiempo de compilación.

  • Una entidad estática se construirá automáticamente algún tiempo antes de
    su primer uso.

  • Una entidad estática tiene una ubicación de almacenamiento asignada, y es
    compartida por todos los que acceden a esa entidad.

  • Solo se puede acceder a una entidad estática a través de su nombre de tipo, no a
    través de una instancia de ese tipo.

  • Un método estático no tiene un argumento implícito 'this', como lo tiene un método de instancia. (Y, por lo tanto, un método estático tiene menos
    sobrecarga de ejecución , una razón para usarlos).

  • Piense en la seguridad del hilo cuando use entidades estáticas.

Algunos detalles sobre estática en MSDN:


4

No es necesario usar estática en este caso como se explica a fondo. También puede inicializar su propiedad sin GetItem()método, ejemplo de ambos a continuación:

namespace MyNamespace
{
    using System;

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

Consumidor:

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

no se puede acceder con una referencia de instancia

Significa que está llamando a un método ESTÁTICO y pasando una instancia. La solución más fácil es eliminar Static, por ejemplo:

público estático vacío ExportToExcel (datos IEnumerable, string sheetName) {


2

Sé que este es un hilo viejo, pero solo pasé 3 horas tratando de descubrir cuál era mi problema. Normalmente sé lo que significa este error, pero también puede encontrarlo de una manera más sutil. Mi problema era que mi clase de cliente (la que llamaba a un método estático desde una clase de instancia) tenía una propiedad de un tipo diferente pero con el mismo nombre que el método estático. El error informado por el compilador fue el mismo que se informó aquí, pero el problema era básicamente la colisión de nombres.

Para cualquier otra persona que reciba este error y ninguna de las anteriores ayuda, intente calificar completamente su clase de instancia con el nombre del espacio de nombres. .. () para que el compilador pueda ver el nombre exacto que quieres decir.


Encontré esto útil. Tuve una colisión de nombres y ni siquiera lo sabía. Tan pronto como agregué el espacio de nombres antes de mi llamada al método, el problema se resolvió.
Max

1

Verifique si su código contiene un espacio de nombres que coincida con la parte derecha de su clase estática.

Dada la clase de barra estática , definida en el espacio de nombres Foo , que implementa un método Jump o una propiedad, es probable que esté recibiendo un error del compilador porque también hay otro espacio de nombres que termina en la barra . Sí, cosas de pescado ;-)

Si es así, significa que está utilizando una barra de uso; y una llamada Bar.Jump () , por lo tanto, una de las siguientes soluciones debe adaptarse a sus necesidades:

  • Califique completamente el nombre de la clase estática con el espacio de nombre correspondiente, lo que da como resultado la declaración Foo.Bar.Jump () . También deberás eliminar Using Bar; declaración
  • Cambie el nombre de la barra del espacio de nombres por un nombre diferente.

En mi caso, el siguiente error del compilador ocurrió en un proyecto de repositorio EF ( Entity Framework ) en una llamada Database.SetInitializer () :

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

Este error surgió cuando agregué un MyProject.ORM. El espacio de nombres de la base de datos , cuyo sufijo ( Base de datos ), como puede observar, coincide con el nombre de la clase de la Base de datos .SetInitializer .

En esto, dado que no tengo control sobre la clase estática de la base de datos de EF y también me gustaría preservar mi espacio de nombres personalizado, decidí calificar completamente la clase estática de la base de datos de EF con su espacio de nombres System.Data.Entity , que resultó al usar el siguiente comando, que compilación tener éxito:

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

Espero eso ayude



1

Esto causa el error:

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

Esta es la solución:

MyClass.MyCoolStaticMethod();

Explicación:

No se puede llamar a un método estático desde una instancia de un objeto. El objetivo de los métodos estáticos es no estar vinculado a instancias de objetos, sino persistir a través de todas las instancias de ese objeto, y / o ser utilizado sin ninguna instancia del objeto.


0
YourClassName.YourStaticFieldName

Para su campo estático se vería así:

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

Desde otra clase, puede acceder al campo estático de la siguiente manera:

    class Program
    {
     static void Main(string[] args)
     {
         double radius = 6;
         double areaOfCircle = 0;

         areaOfCircle = StaticExample.Pi * radius * radius;
         Console.WriteLine("Area = "+areaOfCircle);

         Console.ReadKey();
     }
  }

¿Quizás podría traducir su solución en el ejemplo de la pregunta y explicar un poco sobre cómo funcionan los campos estáticos con respecto a las definiciones de clase e instancias?
noetix

Gracias por tu comentario, ¿qué tal ahora @Alex?
Hedego
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.