2009-07-08 5 views
120

estoy metiendo en C# y estoy teniendo este problema:miembros <method> 'no se puede acceder con una instancia refiero

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 control de usuario:

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 al Property1. El intellisense solo me da "Equals, GetHashCode, GetType y ToString" como opciones. Cuando el puntero del ratón sobre oItem.Property1, Visual Studio me da esta explicación:

Member MyDataLayer.Section1.MyClass.MyItem.Property1.get cannot be accessed with an instance reference, qualify it with a type name instead

no estoy seguro de lo que esto significa, he hecho un poco googleando, pero no fue capaz de resolverlo.

Respuesta

183

En C#, a diferencia de VB.NET y Java, no puede acceder a los miembros static con sintaxis de instancia. Que debe hacer:

MyClass.MyItem.Property1 

para referirse a la propiedad o quitar el modificador de staticProperty1 (que es lo que probablemente querrá hacer). Para obtener una idea conceptual sobre qué static is, see my other answer.

29

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

Por lo tanto, es necesario tanto para escribir,

MyClass.MyItem.Property1 

O (esto es probablemente lo que tiene que hacer) hacer Property1 una propiedad de instancia mediante la eliminación de la palabra clave static de su definición.

Las propiedades estáticas se comparten entre todas las instancias de su clase, por lo que solo tienen un valor. Tal como se define ahora, no tiene sentido crear instancias de su clase MyItem.

+0

Este "O (esto es probablemente lo que tiene que hacer) hacer Propiedad1 una propiedad de instancia por eliminando la palabra clave estática de su definición ". es la clave del exito !! Gracias – tim687

17

que tenían el mismo problema - aunque unos años más tarde, algunos pueden encontrar algunos consejos útiles:

No utilice ‘estática’ a título gratuito!

Comprender qué implica "estática" en términos de tiempo de ejecución y semántica de compilación (comportamiento) y sintaxis.

  • una entidad estática se construye automáticamente un tiempo antes de
    su primer uso.

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

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

  • Un método estático no tiene un argumento 'this' implícito, al igual que un método de instancia . (Y, por tanto, un método estático tiene menos gastos generales de ejecución
    - una de las razones para usarlos.)

  • pensar en la seguridad cuando se utiliza hilo de entidades estáticas.

Algunos detalles sobre estática en MSDN:

1

no se puede acceder con una instancia hagan referencia

Significa que está llamando a un método STATIC y le está pasando una instancia. La solución más fácil es para eliminar la estática, por ejemplo:

pública estática vacío ExportToExcel (datos IEnumerable, cadena SHEETNAME) {

0

Compruebe si el código contiene un espacio de nombres, que el derecho mayor parte coincide con el nombre de la clase estática .

Dada la estática Bar clase, que se define en espacio de nombres Foo, la implementación de un método de Saltar o una propiedad, es probable que usted está recibiendo error de compilación, porque también hay otro espacio de nombres que finaliza el Bar. Sí, fishi cosas ;-)

Si eso es así, significa que el uso de un Using Bar; y una Bar.Jump() llamada, por lo tanto, una de las siguientes soluciones deben adaptarse a sus necesidades:

  • calificar totalmente nombre de la clase estática con namepace acuerdo, que se traducen en Foo.Bar.Jump() declaración. También necesitará eliminar Using Bar; instrucción
  • Cambie el nombre del espacio de nombres Barra por un nombre diferente.

En mi caso, el error foollowing compilador se produjo en un EF (Marco de la entidad) proyecto de repositorio en un Database.SetInitializer() llamada:

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

Este error al Arouse Agregué un MyProject.ORM.Base de datos espacio de nombres, que el sufijo (base de datos), como se puede notar, coincide con la base de datos .SetInitializer nombre de la clase.

En esto, ya que no tengo ningún control sobre la clase de base de datos estática de EF y también me gustaría mantener mi espacio de nombres personalizado, decidí calificar totalmente clase estática de base de datos de EF con su namepace System.Data.Entity, que resultó en usar el siguiente comando, que la compilación tiene éxito:

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

creo que sirve

0

llegué aquí buscando en google para C# error del compilador CS0176, a través de (por duplicado) pregunta Static member instance reference issue.

En mi caso, el error ocurrió porque tenía un método estático y un método de extensión con el mismo nombre. Para eso, vea Static method and extension method with same name.

[Puede ser que esto debería haber sido un comentario. Lo siento, todavía no tengo suficiente reputación.]

0

Sé que este es un tema antiguo, pero solo pasé 3 horas tratando de descubrir cuál era mi problema. Normalmente sé lo que significa este error, pero también puedes toparte con esto de una manera más sutil. Mi problema era que mi clase de cliente (la que llamaba a un método estático de 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 fue básicamente la colisión de nombres.

Para cualquier otra persona que obtenga este error y ninguna de las anteriores le ayude, 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.

2

No es necesario utilizar estática en este caso, como se explica a fondo. Es lo mismo que inicializar su propiedad sin GetItem() método, ejemplo tanto 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"; 
    } 
} 

consumo:

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