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:Equals
GetHashCode
GetType
ToString
oItem.Property1
Member
MyDataLayer.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.
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:
fuente
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:Consumidor:
fuente
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áticovacío ExportToExcel (datos IEnumerable, string sheetName) {fuente
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.
fuente
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:
En mi caso, el siguiente error del compilador ocurrió en un proyecto de repositorio EF ( Entity Framework ) en una llamada Database.SetInitializer () :
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:
Espero eso ayude
fuente
Llegué a Google buscando el error del compilador de C # CS0176, a través del problema de referencia de instancia de miembro estático de pregunta (duplicada) .
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 Método estático y método de extensión con el mismo nombre .
[Puede ser esto debería haber sido un comentario. Lamento no tener suficiente reputación todavía.]
fuente
Esto causa el error:
Esta es la solución:
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.
fuente
Para su campo estático se vería así:
Desde otra clase, puede acceder al campo estático de la siguiente manera:
fuente